forked from MagicBane/Server
Compare commits
194 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 210faaec6d | |||
| 16be9b9dae | |||
| 2b8f709182 | |||
| aec22d8563 | |||
| 1996d042f0 | |||
| 27b6665717 | |||
| ce20045611 | |||
| 277f8bfd69 | |||
| 1da2db856f | |||
| 33dfe1389c | |||
| 013b69405a | |||
| ca07a53835 | |||
| bbdb6ae1f6 | |||
| 4a63222318 | |||
| 1a1c552964 | |||
| 3587dc2d75 | |||
| 96eb9a3ad0 | |||
| eaa70f43c0 | |||
| a426b773d3 | |||
| 84841edda9 | |||
| d416dbe47b | |||
| 7052da7e54 | |||
| 8f2a2f0ba6 | |||
| d575ba663d | |||
| 964fe7f335 | |||
| d3e92d6576 | |||
| 9dbd6069f1 | |||
| 7ae25c9a1b | |||
| 689969a005 | |||
| b270e1ac8d | |||
| 95d38cea44 | |||
| 3ed0765fe5 | |||
| 0c90164c24 | |||
| a45fa39afc | |||
| 8959f5e1c5 | |||
| df338ab00e | |||
| ac7a2452d6 | |||
| 80104e6d07 | |||
| 8f394cd01d | |||
| e5a32c83c5 | |||
| 8dce20e69f | |||
| 3428a06bb8 | |||
| 177f9a1ff6 | |||
| 9d93944dd1 | |||
| a4cba1a352 | |||
| 17b4232d80 | |||
| 2eb58eb719 | |||
| db5a4195ad | |||
| 3fb29f8e2b | |||
| dacdb2cf35 | |||
| c8473cbe03 | |||
| e9edf8a7ea | |||
| 5a73aa3d90 | |||
| 04101c1c3e | |||
| 0c9343f24d | |||
| b71710871c | |||
| f6df6db17b | |||
| 3f8b3bc6cb | |||
| 383ef27128 | |||
| d8189768ae | |||
| a5eb2fce75 | |||
| 1fe242a284 | |||
| a4b83ca9a0 | |||
| 2365b26c1c | |||
| 8fb044f71b | |||
| 5ce42475c4 | |||
| 57b9d31fff | |||
| 7671586cb0 | |||
| a1997e31a8 | |||
| f5478e9f64 | |||
| 06abea3576 | |||
| ae6b584a5f | |||
| 9e27c69906 | |||
| 00afe27900 | |||
| 4e5c1a32d3 | |||
| d4f5043a25 | |||
| 03a5a55974 | |||
| dbab4c1212 | |||
| d186a96796 | |||
| 6880d014c3 | |||
| 6542dec358 | |||
| 1a2738c3a9 | |||
| 12118ff125 | |||
| c3a00186ff | |||
| fafa777e98 | |||
| d4da99f61c | |||
| bb293c0c02 | |||
| 1e29971b3c | |||
| 25d70cca4f | |||
| 362832a196 | |||
| ed150a5ccd | |||
| d2247b66f1 | |||
| 3b58ea716c | |||
| 368e548e46 | |||
| 6f3612d196 | |||
| 0f38146fcc | |||
| 1a13f3f096 | |||
| 9cc102ca2a | |||
| 50ff4b89bf | |||
| 9b898825ab | |||
| 5be9033c40 | |||
| 67e55ab0a0 | |||
| 227549bf22 | |||
| 19707d10a3 | |||
| 91565ced89 | |||
| 2383b00c8c | |||
| 405063f036 | |||
| d2f3c6a879 | |||
| 4f759c1bd2 | |||
| 9d7f9ce7b3 | |||
| 56f3dfce92 | |||
| 9a66f18edb | |||
| d7270ffb84 | |||
| dd834a3104 | |||
| e28ed1b882 | |||
| 2370123c72 | |||
| 8a5133f04b | |||
| a0f874b319 | |||
| 415d11ae33 | |||
| f93b1ce30e | |||
| 9fb2e4ff1b | |||
| 601d0f4324 | |||
| cbf7db3347 | |||
| 217be1d234 | |||
| 7fabd6554d | |||
| d673819796 | |||
| a963a331a2 | |||
| eda5b8995f | |||
| d5e95eedf3 | |||
| 032e703704 | |||
| ad1444f5ba | |||
| a4b30b8620 | |||
| 9c002c7bff | |||
| 90495a27d9 | |||
| 1246fa699a | |||
| 511d37f5e0 | |||
| 7a03a0eaa9 | |||
| 2f57cb613e | |||
| e386c3078a | |||
| 3802889834 | |||
| f825b2baba | |||
| 6c92abd083 | |||
| c652379a5f | |||
| 61d34ab4ad | |||
| d511641410 | |||
| c8430625bf | |||
| a418224bbb | |||
| 9e3c13dea3 | |||
| 335850f7ff | |||
| f6baf8fe83 | |||
| 4c9b82b649 | |||
| f2570992e5 | |||
| 6911d6314d | |||
| eaeea9730c | |||
| fb0790a733 | |||
| 3230cd53e1 | |||
| edbce067b8 | |||
| 83877e5107 | |||
| 3a67540212 | |||
| 1a5db96023 | |||
| ef82f9ab5b | |||
| bf7e5c6333 | |||
| 443f0f5450 | |||
| cb1dccd630 | |||
| 2e558acbee | |||
| 74162ea54c | |||
| ccbe4fba04 | |||
| 5aeddb6166 | |||
| 49df5203ae | |||
| 0cfe801d18 | |||
| 89c01e8244 | |||
| 6605e4dd61 | |||
| d6239de6fd | |||
| 99ad6f3712 | |||
| f3041e7549 | |||
| 1269031be3 | |||
| ce96274f28 | |||
| a9a9bd0a3d | |||
| 33789adadc | |||
| 15b50a75c4 | |||
| ead34dbb1f | |||
| a9b1356efa | |||
| 33e105bc7b | |||
| e5041147f4 | |||
| 576e627ad1 | |||
| 4059664354 | |||
| 974c0ca7e8 | |||
| 8e7a7b8b6d | |||
| 1e3b1db905 | |||
| 51c98746c4 | |||
| 4c21439847 | |||
| 31385ee533 | |||
| bd4e34e0e1 | |||
| 9f591b166b |
@@ -211,7 +211,7 @@ public class Enum {
|
||||
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
||||
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
||||
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f),
|
||||
IREKEI(6.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f);
|
||||
IREKEI(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f);
|
||||
|
||||
private float walkStandard;
|
||||
private float walkCombat;
|
||||
|
||||
@@ -525,9 +525,11 @@ public enum InterestManager implements Runnable {
|
||||
player.setDirtyLoad(true);
|
||||
updateStaticList(player, origin);
|
||||
updateMobileList(player, origin);
|
||||
if(player.level < 10)
|
||||
if(player.level < 10) {
|
||||
player.setLevel((short) 10);
|
||||
|
||||
player.getCharItemManager().addGoldToInventory(1000,false);
|
||||
player.getCharItemManager().addItemToInventory(new MobLoot(player,ItemBase.getItemBase(980066),1,false).promoteToItem(player));
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
||||
|
||||
@@ -11,10 +11,7 @@ package engine.db.handlers;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.Building;
|
||||
import engine.objects.City;
|
||||
import engine.objects.Zone;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.*;
|
||||
@@ -98,19 +95,9 @@ public class dbCityHandler extends dbHandlerBase {
|
||||
public Integer GET_CAPITAL_CITY_COUNT() {
|
||||
|
||||
int cityCount = 0;
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_city;")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while(rs.next()){
|
||||
if(rs.getInt("isNpc") == 0)
|
||||
if(DbManager.BuildingQueries.GET_BUILDINGBYUUID(rs.getInt("treeOfLifeUUID")).getRank() == 8)
|
||||
cityCount++;
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
for(Realm realm : Realm._realms.values()){
|
||||
if(realm.isRuled())
|
||||
cityCount ++;
|
||||
}
|
||||
|
||||
return cityCount;
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum.ItemContainerType;
|
||||
import engine.Enum.ItemType;
|
||||
import engine.Enum.OwnerType;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ChatManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.objects.*;
|
||||
import engine.powers.EffectsBase;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @author Eighty
|
||||
*/
|
||||
public class GimmeCmd extends AbstractDevCmd {
|
||||
|
||||
public GimmeCmd() {
|
||||
super("gimme");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
int amt = 0;
|
||||
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
|
||||
amt = 10000000 - currentGold;
|
||||
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
|
||||
throwbackError(pc, "Failed to add gold to inventory");
|
||||
return;
|
||||
}
|
||||
|
||||
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
|
||||
|
||||
if(pc.level < 75) {
|
||||
pc.setLevel((short) 75);
|
||||
ChatManager.chatSayInfo(pc, "Level set to 75");
|
||||
}
|
||||
pc.getCharItemManager().updateInventory();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Round up current gold in inventory to 10,000,000";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "'./gimme";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.objects.*;
|
||||
|
||||
@@ -72,6 +73,10 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
||||
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
|
||||
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
|
||||
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
||||
out += "Move Speed: " + tar.getSpeed() + newline;
|
||||
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
||||
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
||||
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
||||
throwbackInfo(pc, out);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
||||
this.sendUsage(pc);
|
||||
return;
|
||||
}
|
||||
if (level < 1 || level > 75) {
|
||||
if (level < 1 || level > 80) {
|
||||
this.sendHelp(pc);
|
||||
return;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
|
||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-80";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,6 +27,14 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
|
||||
String output;
|
||||
|
||||
try
|
||||
{
|
||||
simCount = Integer.parseInt(words[0]);
|
||||
}catch(Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
output = "Booty Simulation: Rolls:" + simCount + newline;
|
||||
|
||||
Mob mob = (Mob) target;
|
||||
|
||||
@@ -646,24 +646,25 @@ public enum CombatManager {
|
||||
|
||||
//Get hit chance
|
||||
|
||||
int chance;
|
||||
//int chance;
|
||||
float dif = atr - defense;
|
||||
|
||||
if (dif > 100)
|
||||
chance = 94;
|
||||
else if (dif < -100)
|
||||
chance = 4;
|
||||
else
|
||||
chance = (int) ((0.45 * dif) + 49);
|
||||
//if (dif > 100)
|
||||
// chance = 94;
|
||||
//else if (dif < -100)
|
||||
// chance = 4;
|
||||
//else
|
||||
// chance = (int) ((0.45 * dif) + 49);
|
||||
|
||||
errorTrack = 5;
|
||||
|
||||
//calculate hit/miss
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
DeferredPowerJob dpj = null;
|
||||
|
||||
if (roll < chance) {
|
||||
|
||||
|
||||
if (LandHit((int)atr,(int)defense)) {
|
||||
|
||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
updateAttackTimers((PlayerCharacter) ac, target, true);
|
||||
@@ -1442,4 +1443,19 @@ public enum CombatManager {
|
||||
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
||||
}
|
||||
|
||||
public static boolean LandHit(int atr, int defense){
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
||||
float chance = (float)((atr-((atr+defense)*0.315))/((defense-((atr+defense)*0.315))+(atr-((atr+defense)*0.315))));
|
||||
|
||||
int connvertedChance = (int)(chance * 100);
|
||||
|
||||
if(connvertedChance < 5)
|
||||
connvertedChance = 5;
|
||||
|
||||
if(connvertedChance > 95)
|
||||
connvertedChance = 95;
|
||||
|
||||
return connvertedChance > roll;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
||||
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
||||
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
||||
DevCmdManager.registerDevCmd(new GimmeCmd());
|
||||
DevCmdManager.registerDevCmd(new EnchantCmd());
|
||||
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
||||
// Admin
|
||||
@@ -184,6 +185,8 @@ public enum DevCmdManager {
|
||||
case "printstats":
|
||||
case "printskills":
|
||||
case "printpowers":
|
||||
case "gimme":
|
||||
playerAllowed = true;
|
||||
if(!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
break;
|
||||
|
||||
@@ -77,64 +77,32 @@ public enum LootManager {
|
||||
//determine if mob is in hotzone
|
||||
boolean inHotzone = false;
|
||||
|
||||
//special blood rune droppers
|
||||
MobLoot specialDrop = null;
|
||||
switch(mob.getObjectUUID()) {
|
||||
case 22595://elf 1
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252134),true);
|
||||
mob.setFirstName("Melandrach The Blood-Mage");
|
||||
break;
|
||||
case 22432: //elf 2
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252135),true);
|
||||
mob.setFirstName("Kyrtaar The Blood-Mage");
|
||||
break;
|
||||
case 22537: //elf 3
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252136),true);
|
||||
mob.setFirstName("Vamir The Blood-Mage");
|
||||
break;
|
||||
case 16387: //human 4 DONE
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252129),true);
|
||||
mob.setFirstName("Alatar The Blood-Mage");
|
||||
break;
|
||||
case 32724:// human 5 GOOD
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252130),true);
|
||||
mob.setFirstName("Elphaba The Blood-Mage");
|
||||
break;
|
||||
case 23379: //human 1 GOOD
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252131),true);
|
||||
mob.setFirstName("Bavmorda The Blood-Mage");
|
||||
break;
|
||||
case 10826: //human 2 REDO
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252132),true);
|
||||
mob.setFirstName("Draco The Blood-Mage");
|
||||
break;
|
||||
case 15929: //human 3 GOOD
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252133),true);
|
||||
mob.setFirstName("Atlantes The Blood-Mage");
|
||||
break;
|
||||
}
|
||||
if(specialDrop != null) {
|
||||
mob.setLevel((short) 65);
|
||||
mob.setSpawnTime(10800);
|
||||
mob.healthMax = (7500);
|
||||
mob.setHealth(7500);
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
mob.getCharItemManager().addItemToInventory(specialDrop);
|
||||
mob.setResists(new Resists("Dropper"));
|
||||
if(!Mob.discDroppers.contains(mob))
|
||||
Mob.AddDiscDropper(mob);
|
||||
}
|
||||
|
||||
//iterate the booty sets
|
||||
|
||||
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
|
||||
int i = 0;
|
||||
}
|
||||
|
||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
|
||||
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
||||
|
||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet))
|
||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) {
|
||||
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
||||
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
|
||||
MobLoot specialDrop = null;
|
||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
|
||||
if(specialDrop != null) {
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
mob.getCharItemManager().addItemToInventory(specialDrop);
|
||||
mob.setResists(new Resists("Dropper"));
|
||||
if(!Mob.discDroppers.contains(mob))
|
||||
Mob.AddDiscDropper(mob);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
||||
for (Item it : mob.getInventory()) {
|
||||
@@ -157,22 +125,27 @@ public enum LootManager {
|
||||
boolean hotzoneWasRan = false;
|
||||
float dropRate;
|
||||
|
||||
//1 in 1,000 chance to drop glass
|
||||
if(ThreadLocalRandom.current().nextInt(1,1000) == 500){
|
||||
int glassID = rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if(glassItem != null) {
|
||||
MobLoot toAdd = new MobLoot(mob, glassItem, false);
|
||||
if(!mob.getSafeZone()) {
|
||||
int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100000);
|
||||
//Special Case Contract Drop
|
||||
if(specialCaseRoll < 100){
|
||||
SpecialCaseResourceDrop(mob,entries);
|
||||
} else if(specialCaseRoll > 100 && specialCaseRoll < 500){
|
||||
SpecialCaseContractDrop(mob,entries);
|
||||
}else if(specialCaseRoll > 500 && specialCaseRoll < 900){
|
||||
SpecialCaseRuneDrop(mob,entries);
|
||||
} else if(specialCaseRoll > 900 && specialCaseRoll < 910){
|
||||
int glassID = rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if (glassItem != null) {
|
||||
MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
|
||||
|
||||
if (toAdd != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
if (toAddGlass != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAddGlass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//check for special gifts 1/100 to drop present
|
||||
if(ThreadLocalRandom.current().nextInt(1,25) == 15)
|
||||
DropPresent(mob);
|
||||
|
||||
// Iterate all entries in this bootySet and process accordingly
|
||||
for (BootySetEntry bse : entries) {
|
||||
switch (bse.bootyType) {
|
||||
@@ -209,6 +182,109 @@ public enum LootManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseContractDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int ContractTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.CONTRACT)) {
|
||||
ContractTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(ContractTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ContractTableID));
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int RuneTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
|
||||
RuneTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(RuneTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(RuneTableID));
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SpecialCaseResourceDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int ResourceTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RESOURCE)) {
|
||||
ResourceTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(ResourceTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ResourceTableID));
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
||||
|
||||
if (mob == null || _genTables.containsKey(genTableID) == false)
|
||||
@@ -230,11 +306,10 @@ public enum LootManager {
|
||||
|
||||
//gets the 1-320 roll for this mob
|
||||
int itemTableRoll = 0;
|
||||
int objectType = mob.getObjectType().ordinal();
|
||||
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
||||
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
itemTableRoll = TableRoll(mob.level, inHotzone);
|
||||
itemTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
||||
if (tableRow == null)
|
||||
@@ -306,7 +381,7 @@ public enum LootManager {
|
||||
if(mob.getObjectType().ordinal() == 52) {
|
||||
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
prefixTableRoll = TableRoll(mob.level, inHotzone);
|
||||
prefixTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
||||
|
||||
@@ -338,7 +413,7 @@ public enum LootManager {
|
||||
if(mob.getObjectType().ordinal() == 52) {
|
||||
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||
} else{
|
||||
suffixTableRoll = TableRoll(mob.level, inHotzone);
|
||||
suffixTableRoll = TableRoll(mob.level);
|
||||
}
|
||||
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
||||
|
||||
@@ -353,23 +428,36 @@ public enum LootManager {
|
||||
return inItem;
|
||||
}
|
||||
|
||||
public static int TableRoll(int mobLevel, Boolean inHotzone) {
|
||||
public static int TableRoll(int mobLevel) {
|
||||
|
||||
if (mobLevel > 65)
|
||||
mobLevel = 65;
|
||||
|
||||
int max = (int) (4.882 * mobLevel + 127.0);
|
||||
|
||||
if (max > 319)
|
||||
max = 319;
|
||||
|
||||
int min = (int) (4.469 * mobLevel - 3.469);
|
||||
|
||||
if (min < 70)
|
||||
min = 70;
|
||||
|
||||
if (inHotzone)
|
||||
min += mobLevel;
|
||||
int rank = (int)(mobLevel * 0.1f);
|
||||
int min = 50;
|
||||
int max = 100;
|
||||
switch(rank){
|
||||
case 1:
|
||||
min = 200;
|
||||
max = 250;
|
||||
break;
|
||||
case 2:
|
||||
min = 210;
|
||||
max = 275;
|
||||
break;
|
||||
case 3:
|
||||
min = 220;
|
||||
max = 300;
|
||||
break;
|
||||
case 4:
|
||||
min = 230;
|
||||
max = 320;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
min = 240;
|
||||
max = 320;
|
||||
break;
|
||||
}
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||
|
||||
@@ -401,8 +489,14 @@ public enum LootManager {
|
||||
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
||||
|
||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||
|
||||
if (toAdd != null) {
|
||||
if(toAdd != null){
|
||||
ItemBase ib = toAdd.getItemBase();
|
||||
switch(ib.getType()){
|
||||
case CONTRACT:
|
||||
case RUNE:
|
||||
case RESOURCE:
|
||||
return;
|
||||
}
|
||||
toAdd.setIsID(true);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
@@ -414,6 +508,9 @@ public enum LootManager {
|
||||
if (mob == null || mob.getSafeZone())
|
||||
return; // no equipment to drop in safezones
|
||||
|
||||
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
|
||||
return; // stronghold mobs don't drop equipment
|
||||
|
||||
//do equipment here
|
||||
if (mob.getEquip() != null) {
|
||||
boolean isVorg = false;
|
||||
@@ -426,6 +523,10 @@ public enum LootManager {
|
||||
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
|
||||
isVorg = true;
|
||||
|
||||
if(isVorg && !mob.isDropper){
|
||||
continue;
|
||||
}
|
||||
|
||||
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||
float dropChance = me.getDropChance() * 100;
|
||||
ItemBase itemBase = me.getItemBase();
|
||||
@@ -490,7 +591,7 @@ public enum LootManager {
|
||||
|
||||
//roll 1-100 for the gen table selection
|
||||
|
||||
int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
|
||||
|
||||
if(selectedRow == null)
|
||||
@@ -654,13 +755,128 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
public static void DropPresent(Mob mob){
|
||||
int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
|
||||
int presentID = ItemBase.AnniverseryGifts.get(random);
|
||||
ItemBase presentBase = ItemBase.getItemBase(presentID);
|
||||
if(presentBase != null){
|
||||
MobLoot lootItem = new MobLoot(mob, presentBase, true);
|
||||
mob.getCharItemManager().addItemToInventory(lootItem);
|
||||
int random = 971049 + ThreadLocalRandom.current().nextInt(24);
|
||||
if (random > 971071)
|
||||
random = 971071;
|
||||
|
||||
ItemBase present = ItemBase.getItemBase(random);
|
||||
if (present != null) {
|
||||
MobLoot toAdd = new MobLoot(mob, present, true);
|
||||
|
||||
if (toAdd != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
}
|
||||
}
|
||||
|
||||
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
|
||||
|
||||
mob.getCharItemManager().clearInventory();
|
||||
|
||||
int multiplier = 1;
|
||||
if (commander)
|
||||
multiplier = 2;
|
||||
if(epic)
|
||||
multiplier = 10;
|
||||
|
||||
int high = 125000;
|
||||
int low = 50000;
|
||||
int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier;
|
||||
|
||||
if (gold > 0) {
|
||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
||||
mob.getCharItemManager().addItemToInventory(goldAmount);
|
||||
}
|
||||
|
||||
//present drop chance for all
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 35)
|
||||
DropPresent(mob);
|
||||
|
||||
//random contract drop chance for all
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 40) {
|
||||
int contractTableID = 250;
|
||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
||||
if (contractTableID > 259)
|
||||
contractTableID = 659;
|
||||
|
||||
int id = rollRandomItem(contractTableID);
|
||||
ItemBase ib = ItemBase.getItemBase(id);
|
||||
if (ib != null) {
|
||||
MobLoot contract = new MobLoot(mob, ib, true);
|
||||
|
||||
if (contract != null)
|
||||
mob.getCharItemManager().addItemToInventory(contract);
|
||||
}
|
||||
}
|
||||
|
||||
//special commander drop chances
|
||||
if (commander)
|
||||
GenerateCommanderLoot(mob,false);
|
||||
|
||||
//special epic drop chances
|
||||
if (epic) {
|
||||
GenerateCommanderLoot(mob, true);
|
||||
GenerateCommanderLoot(mob,false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void GenerateCommanderLoot(Mob mob, boolean epic){
|
||||
//present chance
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
||||
DropPresent(mob);
|
||||
|
||||
//present chance
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
||||
DropPresent(mob);
|
||||
|
||||
//chance for glass
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int glassID = rollRandomItem(126);
|
||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
||||
if (glassItem != null) {
|
||||
MobLoot toAdd2 = new MobLoot(mob, glassItem, true);
|
||||
|
||||
if (toAdd2 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd2);
|
||||
}
|
||||
}
|
||||
|
||||
//chance for disc
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int discID = rollRandomItem(3202);
|
||||
ItemBase discItem = ItemBase.getItemBase(discID);
|
||||
if (discItem != null) {
|
||||
MobLoot toAdd3 = new MobLoot(mob, discItem, true);
|
||||
|
||||
if (toAdd3 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd3);
|
||||
}
|
||||
}
|
||||
|
||||
//chance for stat rune
|
||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
||||
int runeID = rollRandomItem(3201);
|
||||
ItemBase runeItem = ItemBase.getItemBase(runeID);
|
||||
if (runeItem != null) {
|
||||
MobLoot toAdd4 = new MobLoot(mob, runeItem, true);
|
||||
|
||||
if (toAdd4 != null)
|
||||
mob.getCharItemManager().addItemToInventory(toAdd4);
|
||||
}
|
||||
}
|
||||
if(epic){
|
||||
int contractTableID = 250;
|
||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
||||
if (contractTableID > 259)
|
||||
contractTableID = 659;
|
||||
|
||||
int id = rollRandomItem(contractTableID);
|
||||
ItemBase ib = ItemBase.getItemBase(id);
|
||||
if (ib != null) {
|
||||
MobLoot contract = new MobLoot(mob, ib, true);
|
||||
|
||||
if (contract != null)
|
||||
mob.getCharItemManager().addItemToInventory(contract);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,43 +186,8 @@ public enum MaintenanceManager {
|
||||
// If this is an R8 tree, validate that we can
|
||||
// cover the resources required
|
||||
|
||||
if (building.getRank() == 8) {
|
||||
|
||||
hasResources = true;
|
||||
|
||||
if (warehouse == null)
|
||||
hasResources = false;
|
||||
else {
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
||||
|
||||
if (resourceValue < 1500)
|
||||
hasResources = false;
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
||||
|
||||
if (resourceValue < 1500)
|
||||
hasResources = false;
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
||||
|
||||
if (resourceValue < 5)
|
||||
hasResources = false;
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||
|
||||
if (resourceValue < 5)
|
||||
hasResources = false;
|
||||
|
||||
}
|
||||
}
|
||||
// Validation completed but has failed. We can derank
|
||||
// the target building and early exit
|
||||
|
||||
if ((hasFunds == false) ||
|
||||
((building.getRank() == 8) && !hasResources)) {
|
||||
|
||||
|
||||
if (hasFunds == false) {
|
||||
return false; // Early exit for having failed to meet maintenance
|
||||
}
|
||||
|
||||
@@ -247,58 +212,6 @@ public enum MaintenanceManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Early exit as we're done if we're not an R8 tree
|
||||
|
||||
if (building.getRank() < 8)
|
||||
return true;
|
||||
|
||||
// Now for the resources if it's an R8 tree
|
||||
|
||||
// Withdraw Stone
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
|
||||
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
|
||||
} else {
|
||||
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
// Withdraw Lumber
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
|
||||
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
|
||||
} else {
|
||||
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
// Withdraw Galvor
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
|
||||
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
|
||||
} else {
|
||||
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||
|
||||
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
|
||||
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
|
||||
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
|
||||
} else {
|
||||
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -340,8 +340,8 @@ public enum NPCManager {
|
||||
else
|
||||
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
||||
|
||||
if (buildingSlot == -1)
|
||||
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||
//if (buildingSlot == -1)
|
||||
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||
|
||||
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package engine.gameManager;
|
||||
|
||||
import com.sun.corba.se.spi.orbutil.fsm.ActionBase;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
@@ -27,6 +28,7 @@ import engine.net.client.ClientConnection;
|
||||
import engine.net.client.msg.*;
|
||||
import engine.objects.*;
|
||||
import engine.powers.*;
|
||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||
import engine.powers.poweractions.AbstractPowerAction;
|
||||
import engine.powers.poweractions.TrackPowerAction;
|
||||
import engine.server.MBServerStatics;
|
||||
@@ -205,6 +207,41 @@ public enum PowersManager {
|
||||
|
||||
boolean CSRCast = false;
|
||||
|
||||
if(msg.getPowerUsedID() == 430628895) {
|
||||
|
||||
boolean failed = false;// group teleport
|
||||
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
|
||||
if (city == null) {
|
||||
failed = true;
|
||||
}else{
|
||||
Bane bane = city.getBane();
|
||||
if (bane == null) {
|
||||
failed = true;
|
||||
}else{
|
||||
if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(failed){
|
||||
//check to see if we are at an active mine
|
||||
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
||||
if(zone != null){
|
||||
Mine mine = null;
|
||||
for(Building building : zone.zoneBuildingSet){
|
||||
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)){
|
||||
mine = Mine.getMineFromTower(building.getObjectUUID());
|
||||
}
|
||||
}
|
||||
if(mine != null){
|
||||
failed = !mine.isActive;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(failed)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (MBServerStatics.POWERS_DEBUG) {
|
||||
ChatManager.chatSayInfo(
|
||||
@@ -241,6 +278,7 @@ public enum PowersManager {
|
||||
|
||||
// get power
|
||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
||||
|
||||
if (pb == null) {
|
||||
ChatManager.chatSayInfo(playerCharacter,
|
||||
"This power is not implemented yet.");
|
||||
@@ -252,6 +290,35 @@ public enum PowersManager {
|
||||
// return false;
|
||||
}
|
||||
|
||||
//check for movement buffs while flying
|
||||
if(playerCharacter.isFlying()) {
|
||||
switch(pb.token){
|
||||
case 429005674:
|
||||
case 429505739:
|
||||
case 431054700:
|
||||
case 428005600:
|
||||
case 431610080:
|
||||
case 427935608:
|
||||
case 427857146:
|
||||
case 427988218:
|
||||
case 431854842:
|
||||
case 421074170:
|
||||
case 429611355:
|
||||
case 428955899:
|
||||
case 1794395699:
|
||||
case 429428796:
|
||||
case 1514898036:
|
||||
ChatManager.chatSystemInfo(playerCharacter, "You Cannot Fly While Having A MovementBuff");
|
||||
//resync stamina
|
||||
playerCharacter.setStamina(playerCharacter.getStamina(), playerCharacter);
|
||||
|
||||
// Update all surrounding clients.
|
||||
TargetedActionMsg cmm = new TargetedActionMsg(playerCharacter);
|
||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (playerCharacter.getLastPower() != null)
|
||||
return true;
|
||||
|
||||
@@ -279,6 +346,12 @@ public enum PowersManager {
|
||||
msg.setNumTrains(trains);
|
||||
}
|
||||
|
||||
switch(pb.token){
|
||||
case 429420458: // BH eyes
|
||||
msg.setNumTrains(msg.getNumTrains() * 2);
|
||||
break;
|
||||
}
|
||||
|
||||
// can't go over total trains by player
|
||||
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
||||
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
||||
@@ -370,15 +443,20 @@ public enum PowersManager {
|
||||
float range = pb.getRange();
|
||||
// verify target is in range
|
||||
|
||||
if(pb.token != 429396028) {
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, target, range))
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
return true;
|
||||
// verify target is valid type
|
||||
if (!validateTarget(target, playerCharacter, pb))
|
||||
return true;
|
||||
}else{
|
||||
pb.isSpell = false;
|
||||
}
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, target, range))
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
return true;
|
||||
|
||||
// verify target is valid type
|
||||
if (!validateTarget(target, playerCharacter, pb))
|
||||
return true;
|
||||
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
@@ -487,7 +565,6 @@ public enum PowersManager {
|
||||
// Validity checks passed, move on to casting spell
|
||||
//get caster's live counter
|
||||
int casterLiveCounter = playerCharacter.getLiveCounter();
|
||||
|
||||
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
||||
if (time > 0) {
|
||||
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
||||
@@ -522,7 +599,9 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
// update cast (use skill) fail condition
|
||||
playerCharacter.cancelOnCast();
|
||||
if(pb.token != 429396028) {
|
||||
playerCharacter.cancelOnCast();
|
||||
}
|
||||
|
||||
// update castSpell (use spell) fail condition if spell
|
||||
if (pb.isSpell())
|
||||
@@ -541,7 +620,6 @@ public enum PowersManager {
|
||||
|
||||
|
||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||
|
||||
// run timer job to end cast
|
||||
if (time < 1) // run immediately
|
||||
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
||||
@@ -706,6 +784,11 @@ public enum PowersManager {
|
||||
if (playerCharacter == null || msg == null)
|
||||
return;
|
||||
|
||||
if((msg.getPowerUsedID() == 429495514 || msg.getPowerUsedID() == 429407306) && playerCharacter.getRace().getName().toLowerCase().contains("shade")){
|
||||
//msg.setPowerUsedID(407015607);
|
||||
applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429397210,msg.getNumTrains(),false);
|
||||
}
|
||||
|
||||
if (playerCharacter.isCasting()) {
|
||||
playerCharacter.update();
|
||||
playerCharacter.updateStamRegen(-100);
|
||||
@@ -809,15 +892,16 @@ public enum PowersManager {
|
||||
}
|
||||
float range = pb.getRange() + speedRange;
|
||||
|
||||
if(pb.token != 429396028) {
|
||||
|
||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||
|
||||
sendPowerMsg(playerCharacter, 8, msg);
|
||||
return;
|
||||
sendPowerMsg(playerCharacter, 8, msg);
|
||||
return;
|
||||
}
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
}
|
||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||
// TODO send message that target is out of range
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1233,7 +1317,7 @@ public enum PowersManager {
|
||||
|
||||
PlayerCharacter target = SessionManager
|
||||
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||
if (target == null || target.equals(pc) || target.isCombat()) {
|
||||
if (target == null || target.equals(pc)) {
|
||||
|
||||
if (target == null) // Player not found. Send not found message
|
||||
ChatManager.chatInfoError(pc,
|
||||
@@ -1337,6 +1421,16 @@ public enum PowersManager {
|
||||
else
|
||||
duration = 45000; // Belgosh Summons, 45 seconds
|
||||
|
||||
boolean enemiesNear = false;
|
||||
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)){
|
||||
PlayerCharacter playerCharacter = (PlayerCharacter)awo;
|
||||
if(!playerCharacter.guild.getNation().equals(pc.guild.getNation())){
|
||||
enemiesNear = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(enemiesNear && !pc.isInSafeZone())
|
||||
duration += 60000;
|
||||
|
||||
// Teleport to summoners location
|
||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||
@@ -1462,8 +1556,17 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
// create list of characters
|
||||
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
||||
allTargets, playerCharacter, maxTargets);
|
||||
HashSet<AbstractCharacter> trackChars;
|
||||
switch(msg.getPowerToken()){
|
||||
case 431511776:
|
||||
case 429578587:
|
||||
case 429503360:
|
||||
trackChars = getTrackList(playerCharacter);
|
||||
break;
|
||||
default:
|
||||
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
break;
|
||||
}
|
||||
|
||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||
|
||||
@@ -1476,6 +1579,30 @@ public enum PowersManager {
|
||||
|
||||
}
|
||||
|
||||
public static HashSet<AbstractCharacter> getTrackList(PlayerCharacter tracker){
|
||||
HashSet<AbstractCharacter> list = new HashSet<AbstractCharacter>();
|
||||
HashSet<AbstractWorldObject> shortList = WorldGrid.getObjectsInRangePartial(tracker.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
|
||||
HashSet<AbstractWorldObject> fullList = WorldGrid.getObjectsInRangePartial(tracker.loc,1408, MBServerStatics.MASK_PLAYER);
|
||||
ArrayList<Guild> guildsPresent = new ArrayList<>();
|
||||
for(AbstractWorldObject awo : shortList){
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
if(!guildsPresent.contains(pc.guild.getNation())){
|
||||
guildsPresent.add(pc.guild.getNation());
|
||||
}
|
||||
}
|
||||
for(AbstractWorldObject awo : fullList){
|
||||
if(awo.equals(tracker))
|
||||
continue;
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
if(!pc.isAlive())
|
||||
continue;
|
||||
if(guildsPresent.contains(pc.guild.getNation()))
|
||||
list.add(pc);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
private static void sendRecyclePower(int token, ClientConnection origin) {
|
||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
||||
|
||||
@@ -2241,28 +2368,26 @@ public enum PowersManager {
|
||||
defense = 0f;
|
||||
// Get hit chance
|
||||
|
||||
if (pc.getDebug(16)) {
|
||||
String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||
ChatManager.chatSystemInfo(pc, smsg);
|
||||
}
|
||||
//if (pc.getDebug(16)) {
|
||||
// String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||
// ChatManager.chatSystemInfo(pc, smsg);
|
||||
//}
|
||||
|
||||
int chance;
|
||||
//int chance;
|
||||
|
||||
if (atr > defense || defense == 0)
|
||||
chance = 94;
|
||||
else {
|
||||
float dif = atr / defense;
|
||||
if (dif <= 0.8f)
|
||||
chance = 4;
|
||||
else
|
||||
chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||
}
|
||||
//if (atr > defense || defense == 0)
|
||||
// chance = 94;
|
||||
//else {
|
||||
// float dif = atr / defense;
|
||||
// if (dif <= 0.8f)
|
||||
// chance = 4;
|
||||
// else
|
||||
// chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||
//}
|
||||
|
||||
// calculate hit/miss
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
|
||||
boolean disable = true;
|
||||
if (roll < chance) {
|
||||
if (CombatManager.LandHit((int)atr,(int)defense)) {
|
||||
// Hit, check if dodge kicked in
|
||||
if (awo instanceof AbstractCharacter) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||
@@ -2562,7 +2687,9 @@ public enum PowersManager {
|
||||
}
|
||||
|
||||
public static void cancelOnStun(AbstractCharacter ac) {
|
||||
|
||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
|
||||
}
|
||||
}
|
||||
|
||||
private static PowersBase getLastPower(AbstractCharacter ac) {
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.math.Vector3f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class StrongholdManager {
|
||||
|
||||
public static void processStrongholds() {
|
||||
ArrayList<Mine> mines = Mine.getMines();
|
||||
|
||||
|
||||
//process strongholds selecting 3 randomly to become active
|
||||
int count = 0;
|
||||
while (count < 3) {
|
||||
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
|
||||
Mine mine = mines.get(random);
|
||||
if (mine != null) {
|
||||
if (!mine.isActive && !mine.isStronghold) {
|
||||
StartStronghold(mine);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void StartStronghold(Mine mine){
|
||||
|
||||
//remove buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
mine.isStronghold = true;
|
||||
mine.strongholdMobs = new ArrayList<>();
|
||||
mine.oldBuildings = new HashMap<>();
|
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
for(Building building : mineZone.zoneBuildingSet){
|
||||
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
|
||||
building.setMeshUUID(407650);
|
||||
building.setMeshScale(new Vector3f(0,0,0));
|
||||
InterestManager.setObjectDirty(building);
|
||||
WorldGrid.updateObject(building);
|
||||
}
|
||||
|
||||
//update tower to become stronghold mesh
|
||||
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
|
||||
tower.setMeshScale(new Vector3f(1,1,1));
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
|
||||
//create elite mobs
|
||||
for(int i = 0; i < mine.capSize * 2; i++){
|
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30);
|
||||
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID));
|
||||
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65);
|
||||
if(guard != null){
|
||||
guard.parentZone = mine.getParentZone();
|
||||
guard.bindLoc = loc;
|
||||
guard.setLoc(loc);
|
||||
guard.StrongholdGuardian = true;
|
||||
guard.equipmentSetID = getStrongholdMobEquipSetID(guard);
|
||||
guard.runAfterLoad();
|
||||
guard.setLevel((short)65);
|
||||
guard.setResists(new Resists("Elite"));
|
||||
guard.spawnTime = 1000000000;
|
||||
guard.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
mine.strongholdMobs.add(guard);
|
||||
LootManager.GenerateStrongholdLoot(guard,false,false);
|
||||
guard.healthMax = 12500;
|
||||
guard.setHealth(guard.healthMax);
|
||||
guard.maxDamageHandOne = 1550;
|
||||
guard.minDamageHandOne = 750;
|
||||
guard.atrHandOne = 1800;
|
||||
guard.defenseRating = 2200;
|
||||
guard.setFirstName("Elite Guardian");
|
||||
InterestManager.setObjectDirty(guard);
|
||||
WorldGrid.addObject(guard,loc.x,loc.z);
|
||||
WorldGrid.updateObject(guard);
|
||||
guard.stronghold = mine;
|
||||
guard.mobPowers.clear();
|
||||
guard.mobPowers.put(429399948,20); // find weakness
|
||||
}
|
||||
}
|
||||
//create stronghold commander
|
||||
Vector3fImmutable loc = tower.loc;
|
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID));
|
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75);
|
||||
if(commander != null){
|
||||
commander.parentZone = mine.getParentZone();
|
||||
commander.bindLoc = loc;
|
||||
commander.setLoc(loc);
|
||||
commander.StrongholdCommander = true;
|
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
||||
commander.runAfterLoad();
|
||||
commander.setLevel((short)75);
|
||||
commander.setResists(new Resists("Elite"));
|
||||
commander.spawnTime = 1000000000;
|
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
commander.mobPowers.clear();
|
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,20); // magebolt
|
||||
commander.mobPowers.put(429121388,20); // blight
|
||||
commander.mobPowers.put(431566891,20); // lightning bolt
|
||||
commander.mobPowers.put(428716075,20); // fire bolt
|
||||
commander.mobPowers.put(429010987,20); // ice bolt
|
||||
mine.strongholdMobs.add(commander);
|
||||
LootManager.GenerateStrongholdLoot(commander,true, false);
|
||||
commander.healthMax = 50000;
|
||||
commander.setHealth(commander.healthMax);
|
||||
commander.maxDamageHandOne = 3500;
|
||||
commander.minDamageHandOne = 1500;
|
||||
commander.atrHandOne = 3500;
|
||||
commander.defenseRating = 3500;
|
||||
commander.setFirstName("Guardian Commander");
|
||||
InterestManager.setObjectDirty(commander);
|
||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
||||
WorldGrid.updateObject(commander);
|
||||
commander.stronghold = mine;
|
||||
}
|
||||
|
||||
mine.isActive = true;
|
||||
tower.setProtectionState(Enum.ProtectionState.PROTECTED);
|
||||
tower.getBounds().setRegions(tower);
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!");
|
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!");
|
||||
}
|
||||
|
||||
public static void EndStronghold(Mine mine){
|
||||
|
||||
//restore the buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if(tower == null)
|
||||
return;
|
||||
|
||||
mine.isStronghold = false;
|
||||
|
||||
//get rid of the mobs
|
||||
for(Mob mob : mine.strongholdMobs) {
|
||||
mob.despawn();
|
||||
mob.removeFromCache();
|
||||
DbManager.MobQueries.DELETE_MOB(mob);
|
||||
}
|
||||
|
||||
//restore the buildings
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
for(Building building : mineZone.zoneBuildingSet){
|
||||
if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
|
||||
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
|
||||
building.setMeshScale(new Vector3f(1, 1, 1));
|
||||
InterestManager.setObjectDirty(building);
|
||||
WorldGrid.updateObject(building);
|
||||
}
|
||||
}
|
||||
|
||||
//update tower to become Mine Tower again
|
||||
tower.setMeshUUID(1500100);
|
||||
|
||||
mine.isActive = false;
|
||||
tower.setProtectionState(Enum.ProtectionState.NPC);
|
||||
tower.getBounds().setRegions(tower);
|
||||
InterestManager.setObjectDirty(tower);
|
||||
WorldGrid.updateObject(tower);
|
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
||||
}
|
||||
|
||||
public static int getStrongholdMeshID(Zone parent){
|
||||
while(!parent.isMacroZone()){
|
||||
parent = parent.getParent();
|
||||
if(parent.getName().equalsIgnoreCase("seafloor")){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
switch(parent.getObjectUUID()){
|
||||
case 197:
|
||||
case 234:
|
||||
case 178:
|
||||
case 122:
|
||||
return 814000; //Frost Giant Hall (ICE)
|
||||
case 968:
|
||||
case 951:
|
||||
case 313:
|
||||
case 331:
|
||||
return 5001500; // Lich Queens Keep (UNDEAD)
|
||||
case 785:
|
||||
case 761:
|
||||
case 717:
|
||||
case 737:
|
||||
return 1306600; // Temple of the Dragon (DESERT)
|
||||
case 353:
|
||||
case 371:
|
||||
case 388:
|
||||
case 532:
|
||||
return 564600; // Undead Lord's Keep (SWAMP)
|
||||
case 550:
|
||||
case 508:
|
||||
case 475:
|
||||
case 418:
|
||||
return 1326600; // elven hall
|
||||
case 437:
|
||||
case 491:
|
||||
case 590:
|
||||
case 569:
|
||||
return 602400;
|
||||
case 824:
|
||||
case 842:
|
||||
case 632:
|
||||
return 1600000; // chaos temple
|
||||
}
|
||||
return 456100; // small stockade
|
||||
}
|
||||
|
||||
public static int getStrongholdGuardianID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253004; // Mountain Giant Raider Axe
|
||||
case 5001500:
|
||||
return 253008; // Vampire Spear Warrior
|
||||
case 1306600:
|
||||
return 253007; // Desert Orc Warrior
|
||||
case 564600:
|
||||
return 253010; // Kolthoss Warrior
|
||||
case 1326600:
|
||||
return 253005; //elven warrior
|
||||
case 602400:
|
||||
return 253009; // templar missionary
|
||||
case 1600000:
|
||||
return 253006; // scourger
|
||||
}
|
||||
return 13434; // human sword and board warrior
|
||||
}
|
||||
|
||||
public static int getStrongholdEpicID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253023; // Mountain Giant Raider Axe
|
||||
case 5001500:
|
||||
return 253022; // Vampire Spear Warrior
|
||||
case 1306600:
|
||||
return 253021; // Desert Orc Warrior
|
||||
case 564600:
|
||||
return 253018; // Kolthoss Warrior
|
||||
case 1326600:
|
||||
return 253019; //elven warrior
|
||||
case 602400:
|
||||
return 253024; // templar missionary
|
||||
case 1600000:
|
||||
return 253020; // scourger
|
||||
}
|
||||
return 13434; // human sword and board warrior
|
||||
}
|
||||
|
||||
public static int getStrongholdCommanderID(int ID){
|
||||
switch(ID){
|
||||
case 814000:
|
||||
return 253017;
|
||||
case 5001500:
|
||||
return 253012;
|
||||
case 1306600:
|
||||
return 253016; // Desert Orc Xbow
|
||||
case 564600:
|
||||
return 253011; // xbow kolthoss
|
||||
case 1326600:
|
||||
return 253013; //elven bow warrior
|
||||
case 602400:
|
||||
return 253015; // dune giant with xbow
|
||||
case 1600000:
|
||||
return 253014; // barbator
|
||||
}
|
||||
return 13433;
|
||||
}
|
||||
|
||||
public static int getStrongholdMobEquipSetID(Mob mob) {
|
||||
if(mob.StrongholdGuardian){
|
||||
return 6327;
|
||||
}else{
|
||||
return 10790;
|
||||
}
|
||||
}
|
||||
|
||||
public static void CheckToEndStronghold(Mine mine) {
|
||||
|
||||
boolean stillAlive = false;
|
||||
for (Mob mob : mine.strongholdMobs)
|
||||
if (mob.isAlive())
|
||||
stillAlive = true;
|
||||
|
||||
if (!stillAlive) {
|
||||
// Epic encounter
|
||||
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
||||
if (tower == null)
|
||||
return;
|
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
||||
|
||||
Vector3fImmutable loc = tower.loc;
|
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID));
|
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75);
|
||||
if (commander != null) {
|
||||
commander.parentZone = mine.getParentZone();
|
||||
commander.bindLoc = loc;
|
||||
commander.setLoc(loc);
|
||||
commander.StrongholdEpic = true;
|
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
||||
commander.runAfterLoad();
|
||||
commander.setLevel((short) 85);
|
||||
commander.setResists(new Resists("Elite"));
|
||||
commander.spawnTime = 1000000000;
|
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
||||
commander.mobPowers.clear();
|
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,40); // magebolt
|
||||
commander.mobPowers.put(429121388,40); // blight
|
||||
commander.mobPowers.put(431566891,40); // lightning bolt
|
||||
commander.mobPowers.put(428716075,40); // fire bolt
|
||||
commander.mobPowers.put(429010987,40); // ice bolt
|
||||
mine.strongholdMobs.add(commander);
|
||||
LootManager.GenerateStrongholdLoot(commander, true, true);
|
||||
commander.healthMax = 250000;
|
||||
commander.setHealth(commander.healthMax);
|
||||
commander.maxDamageHandOne = 5000;
|
||||
commander.minDamageHandOne = 2500;
|
||||
commander.atrHandOne = 5000;
|
||||
commander.defenseRating = 3500;
|
||||
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName());
|
||||
InterestManager.setObjectDirty(commander);
|
||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
||||
WorldGrid.updateObject(commander);
|
||||
commander.stronghold = mine;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
||||
return;
|
||||
|
||||
// cannot summon a player in combat
|
||||
if (this.target.isCombat()) {
|
||||
//if (this.target.isCombat()) {
|
||||
|
||||
ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
||||
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
||||
|
||||
PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||
return;
|
||||
}
|
||||
// PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||
// return;
|
||||
//}
|
||||
|
||||
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
||||
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
||||
|
||||
@@ -37,11 +37,11 @@ public class ItemTableEntry {
|
||||
List<ItemTableEntry> itemTableEntryList;
|
||||
|
||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||
|
||||
for (ItemTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
itemTableEntry = iteration;
|
||||
|
||||
if(itemTableEntryList != null) {
|
||||
for (ItemTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
itemTableEntry = iteration;
|
||||
}
|
||||
return itemTableEntry;
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class ItemTableEntry {
|
||||
|
||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||
|
||||
if(itemTableEntryList != null){
|
||||
if(itemTableEntryList != null && itemTableEntryList.size() > 1){
|
||||
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0,itemTableEntryList.size() - 1)).cacheID;
|
||||
}
|
||||
return id;
|
||||
|
||||
@@ -33,11 +33,11 @@ public class ModTableEntry {
|
||||
List<ModTableEntry> itemTableEntryList;
|
||||
|
||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||
|
||||
for (ModTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
modTableEntry = iteration;
|
||||
|
||||
if(itemTableEntryList != null) {
|
||||
for (ModTableEntry iteration : itemTableEntryList)
|
||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||
modTableEntry = iteration;
|
||||
}
|
||||
return modTableEntry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +82,16 @@ public class MobAI {
|
||||
|
||||
mob.updateLocation();
|
||||
|
||||
if(mob.StrongholdGuardian || mob.StrongholdEpic){
|
||||
// attempt to ground all players in attack range
|
||||
for(int i : mob.playerAgroMap.keySet()){
|
||||
PlayerCharacter tar = PlayerCharacter.getFromCache(i);
|
||||
if(tar != null && tar.loc.distanceSquared(mob.loc) < 80){
|
||||
PowersManager.applyPower(mob,tar,tar.loc, 111111,40,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
|
||||
}
|
||||
@@ -400,7 +410,7 @@ public class MobAI {
|
||||
|
||||
PerformActionMsg msg;
|
||||
|
||||
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||
if (!mob.StrongholdCommander && !mob.StrongholdEpic && (!mobPower.isHarmful() || mobPower.targetSelf)) {
|
||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||
} else {
|
||||
@@ -625,9 +635,6 @@ public class MobAI {
|
||||
|
||||
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
||||
|
||||
|
||||
CheckToSendMobHome(mob);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -646,6 +653,9 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
|
||||
if(mob.isPet() == false && mob.isPlayerGuard == false)
|
||||
CheckToSendMobHome(mob);
|
||||
|
||||
if (mob.getCombatTarget() != null) {
|
||||
|
||||
if (mob.getCombatTarget().isAlive() == false) {
|
||||
@@ -854,16 +864,14 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
//No items in inventory.
|
||||
} else if (aiAgent.isHasLoot()) {
|
||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
||||
aiAgent.despawn();
|
||||
aiAgent.deathTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
//Mob never had Loot.
|
||||
} else {
|
||||
//Mob's Loot has been looted.
|
||||
if (aiAgent.isHasLoot()) {
|
||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
||||
aiAgent.despawn();
|
||||
aiAgent.deathTime = System.currentTimeMillis();
|
||||
return;
|
||||
}
|
||||
//Mob never had Loot.
|
||||
} else {
|
||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
|
||||
aiAgent.despawn();
|
||||
aiAgent.deathTime = System.currentTimeMillis();
|
||||
@@ -871,11 +879,14 @@ public class MobAI {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
|
||||
|
||||
if(Mob.discDroppers.contains(aiAgent))
|
||||
return;
|
||||
if(Mob.discDroppers.contains(aiAgent))
|
||||
return;
|
||||
|
||||
if(aiAgent.StrongholdGuardian || aiAgent.StrongholdEpic || aiAgent.StrongholdCommander)
|
||||
return;
|
||||
|
||||
if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
|
||||
if (!Zone.respawnQue.contains(aiAgent)) {
|
||||
Zone.respawnQue.add(aiAgent);
|
||||
}
|
||||
@@ -911,12 +922,13 @@ public class MobAI {
|
||||
|
||||
private static void CheckToSendMobHome(Mob mob) {
|
||||
|
||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
|
||||
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
|
||||
mob.teleport(mob.getOwner().loc);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
|
||||
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
|
||||
mob.teleport(mob.getOwner().loc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mob.BehaviourType.isAgressive) {
|
||||
|
||||
if (mob.isPlayerGuard()) {
|
||||
@@ -947,7 +959,7 @@ public class MobAI {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
|
||||
} else if (!MovementUtilities.inRangeOfBindLocation(mob)) {
|
||||
|
||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
||||
@@ -955,6 +967,7 @@ public class MobAI {
|
||||
|
||||
for (Entry playerEntry : mob.playerAgroMap.entrySet())
|
||||
PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
|
||||
mob.setCombatTarget(null);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
|
||||
@@ -1353,21 +1366,24 @@ public class MobAI {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void RecoverHealth(Mob mob){
|
||||
public static void RecoverHealth(Mob mob) {
|
||||
//recover health
|
||||
|
||||
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
|
||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||
|
||||
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
||||
if (mob.getHealth() < mob.getHealthMax()) {
|
||||
|
||||
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
|
||||
mob.setHealth(mob.getHealth() + recoveredHealth);
|
||||
try {
|
||||
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
|
||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||
|
||||
if (mob.getHealth() > mob.getHealthMax())
|
||||
mob.setHealth(mob.getHealthMax());
|
||||
}
|
||||
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
||||
if (mob.getHealth() < mob.getHealthMax()) {
|
||||
|
||||
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
|
||||
mob.setHealth(mob.getHealth() + recoveredHealth);
|
||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||
|
||||
if (mob.getHealth() > mob.getHealthMax())
|
||||
mob.setHealth(mob.getHealthMax());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,37 +139,22 @@ public class CombatUtilities {
|
||||
}
|
||||
|
||||
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
|
||||
int defenseScore = 0;
|
||||
int attackScore = agent.getAtrHandOne();
|
||||
int defense = 0;
|
||||
int atr = agent.getAtrHandOne();
|
||||
switch (target.getObjectType()) {
|
||||
case PlayerCharacter:
|
||||
defenseScore = ((AbstractCharacter) target).getDefenseRating();
|
||||
defense = ((AbstractCharacter) target).getDefenseRating();
|
||||
break;
|
||||
case Mob:
|
||||
|
||||
Mob mob = (Mob) target;
|
||||
if (mob.isSiege())
|
||||
defenseScore = attackScore;
|
||||
defense = atr;
|
||||
break;
|
||||
case Building:
|
||||
return false;
|
||||
}
|
||||
|
||||
int hitChance;
|
||||
if (attackScore > defenseScore || defenseScore == 0)
|
||||
hitChance = 94;
|
||||
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
|
||||
hitChance = 10;
|
||||
else {
|
||||
float dif = attackScore / defenseScore;
|
||||
if (dif <= 0.8f)
|
||||
hitChance = 4;
|
||||
else
|
||||
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||
if (target.getObjectType() == GameObjectType.Building)
|
||||
hitChance = 100;
|
||||
}
|
||||
return ThreadLocalRandom.current().nextInt(100) > hitChance;
|
||||
return CombatManager.LandHit(atr,defense);
|
||||
}
|
||||
|
||||
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
|
||||
|
||||
@@ -672,6 +672,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
|
||||
|
||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||
@@ -1363,18 +1365,12 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
|
||||
NPC npc = NPC.getFromCache(msg.getNpcID());
|
||||
|
||||
|
||||
switch(npc.getContractID()){
|
||||
case 900:
|
||||
case 1201:
|
||||
case 1202:
|
||||
npc.sellPercent = 0.0f;
|
||||
break;
|
||||
}
|
||||
if (npc == null)
|
||||
return;
|
||||
|
||||
// test within talking range
|
||||
if(npc.isInSafeZone())
|
||||
npc.sellPercent = 0;
|
||||
|
||||
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
|
||||
@@ -1406,6 +1402,12 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
Item buy = null;
|
||||
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
||||
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
||||
if(npc.contract.getObjectUUID() == 890){ // default steward
|
||||
sellInventory = npc.getSellInventorySteward();
|
||||
}
|
||||
if(npc.contract.getObjectUUID() == 889){ // default builder
|
||||
sellInventory = npc.getSellInventoryBuilder();
|
||||
}
|
||||
if (sellInventory == null) {
|
||||
return;
|
||||
}
|
||||
@@ -1435,14 +1437,17 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
bargain = 0;
|
||||
break;
|
||||
}
|
||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||
if(me.getItemBase().getType().equals(ItemType.POTION))
|
||||
profit -= 1.0f;
|
||||
if (profit < 1)
|
||||
profit = 1;
|
||||
cost *= profit;
|
||||
if(npc.getContractID() == 1502041)
|
||||
cost = 2;
|
||||
float profit;
|
||||
|
||||
if(npc.isInSafeZone())
|
||||
profit = 0;
|
||||
else
|
||||
profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||
|
||||
|
||||
if(profit > 0)
|
||||
cost *= profit;
|
||||
|
||||
if (gold.getNumOfItems() - cost < 0) {
|
||||
//dont' have enough goldItem exit!
|
||||
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
||||
@@ -1455,8 +1460,9 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||
return;
|
||||
}
|
||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||
}if(npc.getContractID() == 1502041){
|
||||
me.fromNoob = true;
|
||||
} else if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
||||
return;
|
||||
|
||||
@@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
||||
if (city != null)
|
||||
bane = city.getBane();
|
||||
|
||||
if (bane != null && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
||||
if (bane != null){// && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
||||
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ public class GroupInviteResponseHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Run Keyclone Audit
|
||||
|
||||
KEYCLONEAUDIT.audit(player, group);
|
||||
//KEYCLONEAUDIT.audit(player, group);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -360,6 +360,11 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
|
||||
targetItem.recycle(vendor);
|
||||
vendor.removeItemFromForge(targetItem);
|
||||
|
||||
//refund the gold for cancelled item
|
||||
if(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue() < 15000000){
|
||||
vendor.building.setStrongboxValue(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue());
|
||||
}
|
||||
|
||||
// Refresh vendor's inventory to client
|
||||
|
||||
outMsg = new ManageNPCMsg(vendor);
|
||||
|
||||
@@ -62,16 +62,23 @@ public class MOTDEditHandler extends AbstractClientMsgHandler {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type == 1) // Guild MOTD
|
||||
if (type == 1) { // Guild MOTD
|
||||
msg.setMessage(guild.getMOTD());
|
||||
else if (type == 3) // IC MOTD
|
||||
guild.updateDatabase();
|
||||
}else if (type == 3) { // IC MOTD
|
||||
msg.setMessage(guild.getICMOTD());
|
||||
else if (type == 0) { // Nation MOTD
|
||||
guild.updateDatabase();
|
||||
}else if (type == 0) { // Nation MOTD
|
||||
Guild nation = guild.getNation();
|
||||
if (nation == null || !nation.isNation()) {
|
||||
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
|
||||
return true;
|
||||
}
|
||||
nation.setNMOTD(msg.getMessage());
|
||||
nation.updateDatabase();
|
||||
for(Guild sub : nation.getSubGuildList()){
|
||||
sub.setNMOTD(nation.getNMOTD());
|
||||
}
|
||||
msg.setMessage(nation.getMOTD());
|
||||
}
|
||||
dispatch = Dispatch.borrow(playerCharacter, msg);
|
||||
|
||||
@@ -193,31 +193,28 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
||||
int trains = 0;
|
||||
switch(npc.getRank()){
|
||||
case 1:
|
||||
trains = 5;
|
||||
break;
|
||||
case 2:
|
||||
trains = 10;
|
||||
break;
|
||||
case 3:
|
||||
case 2:
|
||||
trains = 15;
|
||||
break;
|
||||
case 4:
|
||||
case 3:
|
||||
trains = 20;
|
||||
break;
|
||||
case 5:
|
||||
case 4:
|
||||
trains = 25;
|
||||
break;
|
||||
case 6:
|
||||
case 5:
|
||||
trains = 30;
|
||||
break;
|
||||
case 7:
|
||||
case 6:
|
||||
trains = 35;
|
||||
break;
|
||||
case 7:
|
||||
trains = 40;
|
||||
break;
|
||||
}
|
||||
|
||||
if(Objects.requireNonNull(shrineBuilding.getCity()).getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
|
||||
trains += 5;
|
||||
|
||||
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
||||
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
||||
shrineBuilding.addEffectBit(1000000 << 2);
|
||||
|
||||
@@ -443,7 +443,12 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
||||
itemMan.consume(item);
|
||||
}
|
||||
break;
|
||||
} else if (uuid > 252122 && uuid < 252128) { //mastery runes
|
||||
} else if (uuid > 252122 && uuid < 252137) { //blood runes
|
||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||
itemMan.consume(item);
|
||||
}
|
||||
break;
|
||||
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
|
||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||
itemMan.consume(item);
|
||||
}
|
||||
@@ -523,7 +528,9 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
dispatch = Dispatch.borrow(player, msg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||
player.cancelOnSpell();
|
||||
if(!item.getItemBase().getType().equals(ItemType.POTION)) {
|
||||
player.cancelOnSpell();
|
||||
}
|
||||
break;
|
||||
default: //shouldn't be here, consume item
|
||||
dispatch = Dispatch.borrow(player, msg);
|
||||
|
||||
@@ -135,7 +135,8 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
msg = (TaxCityMsg) baseMsg;
|
||||
|
||||
ViewTaxes(msg, player);
|
||||
//realm taxing disabled
|
||||
//ViewTaxes(msg, player);
|
||||
|
||||
|
||||
return true;
|
||||
|
||||
@@ -90,12 +90,39 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
}
|
||||
if(runeID == 3040)
|
||||
valid = true;
|
||||
if(runeID == 2514 && raceID == 1999)
|
||||
valid = true;
|
||||
if(runeID == 3036 && raceID == 1999)
|
||||
valid = true;
|
||||
if(runeID == 3033 && raceID == 1999)
|
||||
|
||||
if(runeID == 3049)
|
||||
valid = true;
|
||||
|
||||
if(raceID == 1999){
|
||||
switch(runeID){
|
||||
case 2514:
|
||||
case 3036:
|
||||
case 3033:
|
||||
case 3001:
|
||||
case 3002:
|
||||
case 3003:
|
||||
case 3004:
|
||||
case 3008:
|
||||
case 3009:
|
||||
case 3013:
|
||||
case 3016:
|
||||
case 3017:
|
||||
case 3018:
|
||||
case 3020:
|
||||
case 3021:
|
||||
case 3030:
|
||||
case 3031:
|
||||
case 3037:
|
||||
case 3045:
|
||||
case 3046:
|
||||
case 3047:
|
||||
case 3048:
|
||||
case 3049:
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valid) {
|
||||
return false;
|
||||
}
|
||||
@@ -200,6 +227,9 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
case "Born of the Gwendannen":
|
||||
case "Born of the Invorri":
|
||||
case "Born of the Irydnu":
|
||||
case "Scion of the Dar Khelegeur":
|
||||
case "Scion of the Gwaridorn":
|
||||
case "Scion of the Twathedilion":
|
||||
mod = 0;
|
||||
}
|
||||
if (mod > playerCharacter.getUnusedStatPoints()) {
|
||||
@@ -256,6 +286,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
}
|
||||
//Check if max number runes already reached
|
||||
if (runes.size() > 12) {
|
||||
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
|
||||
return false;
|
||||
}
|
||||
switch (rb.getName()) {
|
||||
@@ -276,19 +307,39 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "Scion of the Dar Khelegeur":
|
||||
case "Scion of the Gwaridorn":
|
||||
case "Scion of the Twathedilion":
|
||||
for (CharacterRune charRune : playerCharacter.getRunes()) {
|
||||
RuneBase rb2 = charRune.getRuneBase();
|
||||
switch (rb2.getName()) {
|
||||
case "Scion of the Dar Khelegeur":
|
||||
case "Scion of the Gwaridorn":
|
||||
case "Scion of the Twathedilion":
|
||||
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
//if discipline, check number applied
|
||||
if (isDiscipline(runeID)) {
|
||||
//if(playerCharacter.getLevel() == 80)
|
||||
discCount -= 1; // level 80 characters get an extra disc rune
|
||||
if (playerCharacter.getLevel() < 70) {
|
||||
if (discCount > 2) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (discCount > 3) {
|
||||
return false;
|
||||
}
|
||||
switch(playerCharacter.getRank()){
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if(discCount > 3)
|
||||
return false;
|
||||
break;
|
||||
case 7:
|
||||
case 8:
|
||||
if(discCount > 5)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//Everything succeeded. Let's apply the rune
|
||||
@@ -351,6 +402,9 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
case "Born of the Gwendannen":
|
||||
case "Born of the Invorri":
|
||||
case "Born of the Irydnu":
|
||||
case "Scion of the Dar Khelegeur":
|
||||
case "Scion of the Gwaridorn":
|
||||
case "Scion of the Twathedilion":
|
||||
cost = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -112,6 +112,12 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
|
||||
|
||||
if (contract != null)
|
||||
sellInventory = contract.getSellInventory();
|
||||
if(npc.contract.getObjectUUID() == 890){ // default steward
|
||||
sellInventory = npc.getSellInventorySteward();
|
||||
}
|
||||
if(npc.contract.getObjectUUID() == 889){ // default builder
|
||||
sellInventory = npc.getSellInventoryBuilder();
|
||||
}
|
||||
}
|
||||
|
||||
if (man != null)
|
||||
|
||||
@@ -485,13 +485,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
|
||||
writer.putInt(building.getRank());
|
||||
|
||||
// Maintenance costs include resource if
|
||||
// this structure is an R8 tree
|
||||
|
||||
if (building.getRank() == 8)
|
||||
writer.putInt(5); // Resources included
|
||||
else
|
||||
writer.putInt(1); // Gold only
|
||||
writer.putInt(1); // Gold only
|
||||
|
||||
writer.putInt(2308551); //Gold
|
||||
if (building.getBlueprint() == null)
|
||||
@@ -499,17 +493,6 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
else
|
||||
writer.putInt(building.getBlueprint().getMaintCost()); // maint cost
|
||||
|
||||
if (building.getRank() == 8) {
|
||||
writer.putInt(74856115); // Stone
|
||||
writer.putInt(1500); // maint cost
|
||||
writer.putInt(-1603256692); // Lumber
|
||||
writer.putInt(1500); // maint cost
|
||||
writer.putInt(-1596311545); // Galvor
|
||||
writer.putInt(5); // maint cost
|
||||
writer.putInt(1532478436); // Wormwood
|
||||
writer.putInt(5); // maint cost
|
||||
}
|
||||
|
||||
LocalDateTime maintDate = building.maintDateTime;
|
||||
|
||||
if (maintDate == null)
|
||||
|
||||
@@ -553,26 +553,58 @@ public class VendorDialogMsg extends ClientNetMsg {
|
||||
|
||||
// verify race valid for profession
|
||||
Race race = pc.getRace();
|
||||
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
||||
// TODO send client promotion error
|
||||
return;
|
||||
if(race.getRaceRuneID() == 1999) {
|
||||
boolean valid = false;
|
||||
switch(promoID){
|
||||
case 2504:
|
||||
case 2505:
|
||||
case 2506:
|
||||
case 2507:
|
||||
case 2510:
|
||||
case 2511:
|
||||
case 2512:
|
||||
case 2514:
|
||||
case 2515:
|
||||
case 2517:
|
||||
case 2518:
|
||||
case 2519:
|
||||
case 2520:
|
||||
case 2521:
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!valid)
|
||||
return;
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
||||
// TODO send client promotion error
|
||||
return;
|
||||
}
|
||||
}
|
||||
// verify baseclass valid for profession
|
||||
BaseClass bc = pc.getBaseClass();
|
||||
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
|
||||
if (bc == null) {
|
||||
// TODO send client promotion error
|
||||
return;
|
||||
}
|
||||
if(!promo.isAllowedRune(bc.getToken())){
|
||||
if(!bc.getName().equals("Rogue") && !promo.getName().equals("Druid"))
|
||||
return;
|
||||
}
|
||||
|
||||
// verify gender
|
||||
if (promoID == 2511 && pc.isMale()) // Fury
|
||||
return;
|
||||
if (promoID == 2512 && pc.isMale()) // Huntress
|
||||
return;
|
||||
if (promoID == 2517 && !pc.isMale()) // Warlock
|
||||
return;
|
||||
|
||||
if(race.getRaceRuneID() != 1999) {
|
||||
// verify gender
|
||||
if (promoID == 2511 && pc.isMale()) // Fury
|
||||
return;
|
||||
if (promoID == 2512 && pc.isMale()) // Huntress
|
||||
return;
|
||||
if (promoID == 2517 && !pc.isMale()) // Warlock
|
||||
return;
|
||||
}
|
||||
// Everything valid. Let's promote
|
||||
pc.setPromotionClass(promo.getObjectUUID());
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import engine.net.ByteBufferWriter;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.UpdateStateMsg;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -91,17 +92,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
protected Resists resists = new Resists("Genric");
|
||||
protected ConcurrentHashMap<String, JobContainer> timers;
|
||||
protected ConcurrentHashMap<String, Long> timestamps;
|
||||
protected int atrHandOne;
|
||||
public int atrHandOne;
|
||||
protected int atrHandTwo;
|
||||
protected int minDamageHandOne;
|
||||
protected int maxDamageHandOne;
|
||||
public int minDamageHandOne;
|
||||
public int maxDamageHandOne;
|
||||
protected int minDamageHandTwo;
|
||||
protected int maxDamageHandTwo;
|
||||
protected float rangeHandOne;
|
||||
protected float rangeHandTwo;
|
||||
protected float speedHandOne;
|
||||
protected float speedHandTwo;
|
||||
protected int defenseRating;
|
||||
public int defenseRating;
|
||||
protected boolean isActive; // <-Do not use this for deleting character!
|
||||
protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
|
||||
protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
|
||||
@@ -496,8 +497,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
boolean canFly = false;
|
||||
PlayerBonuses bonus = flyer.getBonuses();
|
||||
|
||||
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive())
|
||||
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive()) {
|
||||
canFly = true;
|
||||
}
|
||||
if(flyer.effects.containsKey("MoveBuff")){
|
||||
canFly = false;
|
||||
}
|
||||
|
||||
|
||||
return canFly;
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.pmw.tinylog.Logger;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Objects;
|
||||
|
||||
/* @Summary - Blueprint class is used for determining
|
||||
characteristics of instanced player owned
|
||||
@@ -60,13 +61,12 @@ public class Blueprint {
|
||||
this.name = rs.getString("MeshName");
|
||||
this.icon = rs.getInt("Icon");
|
||||
this.buildingGroup = BuildingGroup.valueOf(rs.getString("BuildingGroup"));
|
||||
this.maxRank = rs.getInt("MaxRank");
|
||||
this.maxSlots = rs.getInt("MaxSlots");
|
||||
this.rank1UUID = rs.getInt("Rank1UUID");
|
||||
this.rank3UUID = rs.getInt("Rank3UUID");
|
||||
this.rank7UUID = rs.getInt("Rank7UUID");
|
||||
this.destroyedUUID = rs.getInt("DestroyedUUID");
|
||||
|
||||
this.maxRank = rs.getInt("MaxRank");
|
||||
}
|
||||
|
||||
// Accessors
|
||||
@@ -173,6 +173,21 @@ public class Blueprint {
|
||||
}
|
||||
|
||||
public int getMaxRank() {
|
||||
BuildingGroup bg = this.buildingGroup;
|
||||
switch(bg){
|
||||
case AMAZONHALL:
|
||||
case CATHEDRAL:
|
||||
case GREATHALL:
|
||||
case KEEP:
|
||||
case THIEFHALL:
|
||||
case TEMPLEHALL:
|
||||
case WIZARDHALL:
|
||||
case ELVENHALL:
|
||||
case ELVENSANCTUM:
|
||||
case IREKEIHALL:
|
||||
case FORESTHALL:
|
||||
return 1;
|
||||
}
|
||||
return maxRank;
|
||||
}
|
||||
|
||||
@@ -181,6 +196,21 @@ public class Blueprint {
|
||||
return 1;
|
||||
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
|
||||
return 4;
|
||||
BuildingGroup bg = this.buildingGroup;
|
||||
switch(bg){
|
||||
case AMAZONHALL:
|
||||
case CATHEDRAL:
|
||||
case GREATHALL:
|
||||
case KEEP:
|
||||
case THIEFHALL:
|
||||
case TEMPLEHALL:
|
||||
case WIZARDHALL:
|
||||
case ELVENHALL:
|
||||
case ELVENSANCTUM:
|
||||
case IREKEIHALL:
|
||||
case FORESTHALL:
|
||||
return 3;
|
||||
}
|
||||
return maxSlots;
|
||||
}
|
||||
|
||||
@@ -312,10 +342,24 @@ public class Blueprint {
|
||||
return 0;
|
||||
|
||||
// Early exit for buildings with single or no slots
|
||||
|
||||
if (this.maxSlots <= 1 && !this.buildingGroup.equals(BuildingGroup.TOL))
|
||||
return maxSlots;
|
||||
|
||||
BuildingGroup bg = this.buildingGroup;
|
||||
switch(bg.name()) {
|
||||
case "AMAZONHALL":
|
||||
case "CATHEDRAL":
|
||||
case "GREATHALL":
|
||||
case "THIEFHALL":
|
||||
case "TEMPLEHALL":
|
||||
case "WIZARDHALL":
|
||||
case "ELVENHALL":
|
||||
case "ELVENSANCTUM":
|
||||
case "IREKEIHALL":
|
||||
case "FORESTHALL":
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (this.maxRank == 1 && currentRank == 1)
|
||||
return getMaxSlots();
|
||||
|
||||
@@ -332,9 +376,11 @@ public class Blueprint {
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
availableSlots = 3;
|
||||
break;
|
||||
case 8:
|
||||
availableSlots = 4;
|
||||
break;
|
||||
default:
|
||||
availableSlots = 0;
|
||||
break;
|
||||
|
||||
@@ -182,6 +182,22 @@ public class Building extends AbstractWorldObject {
|
||||
this.setHealth(healthMax);
|
||||
}
|
||||
|
||||
if(!this.ownerIsNPC){
|
||||
//add extra HP for city walls of R8 trees
|
||||
City city = ZoneManager.getCityAtLocation(this.loc);
|
||||
if(city != null){
|
||||
Building ToL = city.getTOL();
|
||||
if(ToL != null){
|
||||
if(ToL.rank == 8){
|
||||
float currentHealth = this.health.get();
|
||||
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
|
||||
this.healthMax *= 1.1f;
|
||||
this.setHealth(newHealth);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Null out blueprint if not needed (npc building)
|
||||
|
||||
if (blueprintUUID == 0)
|
||||
@@ -821,6 +837,10 @@ public class Building extends AbstractWorldObject {
|
||||
return this.meshScale;
|
||||
}
|
||||
|
||||
public void setMeshScale(Vector3f scale) {
|
||||
this.meshScale = scale;
|
||||
}
|
||||
|
||||
public final int getMeshUUID() {
|
||||
return this.meshUUID;
|
||||
}
|
||||
|
||||
@@ -610,6 +610,8 @@ public class CharacterItemManager {
|
||||
if (i == null)
|
||||
return false;
|
||||
|
||||
i.stripCastableEnchants();
|
||||
|
||||
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
|
||||
return false;
|
||||
|
||||
@@ -2009,6 +2011,7 @@ public class CharacterItemManager {
|
||||
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
|
||||
int amt = item.getNumOfItems();
|
||||
item.setNumOfItems(0);
|
||||
item.stripCastableEnchants();
|
||||
MobLoot ml = new MobLoot(this.absCharacter, amt);
|
||||
ml.zeroItem();
|
||||
ml.containerType = Enum.ItemContainerType.INVENTORY;
|
||||
|
||||
@@ -992,6 +992,9 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
|
||||
//Get Base skill for unmodified stats
|
||||
float base = 7f;
|
||||
if(this.skillsBase.getToken() == -660435875){
|
||||
base = 0;
|
||||
}
|
||||
float statMod = 0.5f;
|
||||
if (this.skillsBase.getStrMod() > 0)
|
||||
statMod += (float) this.skillsBase.getStrMod() * (float) (int) ((PlayerCharacter) CharacterSkill.GetOwner(this)).statStrBase / 100f;
|
||||
@@ -1009,7 +1012,7 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
statMod = 600f;
|
||||
base += CharacterSkill.baseSkillValues[(int) statMod];
|
||||
|
||||
if (base + bonus < 1f)
|
||||
if (base + bonus < 1f && this.skillsBase.getToken() != -660435875)
|
||||
this.baseAmountBeforeMods = 1f;
|
||||
else
|
||||
this.baseAmountBeforeMods = base + bonus;
|
||||
@@ -1084,6 +1087,9 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
//Get Base skill for modified stats
|
||||
//TODO this fomula needs verified
|
||||
float base = 7f;
|
||||
if(this.skillsBase.getToken() == -660435875){
|
||||
base = 0;
|
||||
}
|
||||
float statMod = 0.5f;
|
||||
if (this.skillsBase.getStrMod() > 0)
|
||||
statMod += (float) this.skillsBase.getStrMod() * (float) CharacterSkill.GetOwner(this).getStatStrCurrent() / 100f;
|
||||
@@ -1099,6 +1105,9 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
statMod = 1f;
|
||||
else if (statMod > 600)
|
||||
statMod = 600f;
|
||||
if(this.skillsBase.getToken() == -660435875){
|
||||
statMod = 0;
|
||||
}
|
||||
base += CharacterSkill.baseSkillValues[(int) statMod];
|
||||
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace());
|
||||
|
||||
@@ -1109,7 +1118,7 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
base += bonus + CharacterSkill.GetOwner(this).getBonuses().getFloat(ModType.Skill, sourceType);
|
||||
}
|
||||
|
||||
if (base < 1f)
|
||||
if (base < 1f && this.skillsBase.getToken() != -660435875)
|
||||
this.baseAmount = 1f;
|
||||
else
|
||||
this.baseAmount = base;
|
||||
|
||||
@@ -289,8 +289,11 @@ public class City extends AbstractWorldObject {
|
||||
else
|
||||
writer.putString(rulingNation.getName());
|
||||
|
||||
writer.putInt(city.getTOL().getRank());
|
||||
|
||||
if(city.getTOL() != null) {
|
||||
writer.putInt(city.getTOL().getRank());
|
||||
} else{
|
||||
writer.putInt(1);
|
||||
}
|
||||
if (city.isNoobIsle > 0)
|
||||
writer.putInt(1);
|
||||
else
|
||||
|
||||
@@ -92,6 +92,9 @@ public class Contract extends AbstractGameObject {
|
||||
case 899: //alchemist
|
||||
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
|
||||
}
|
||||
if(this.getName().toLowerCase().contains("sage")){
|
||||
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
|
||||
}
|
||||
this.equipmentSet = rs.getInt("equipSetID");
|
||||
this.inventorySet = rs.getInt("inventorySet");
|
||||
|
||||
@@ -208,9 +211,9 @@ public class Contract extends AbstractGameObject {
|
||||
for(MobEquipment me : this.sellInventory){
|
||||
if(me.getItemBase().getType().equals(Enum.ItemType.RESOURCE)){
|
||||
int amountResource = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
||||
me.magicValue = amountResource * me.getItemBase().getBaseValue() * 2;
|
||||
me.magicValue = amountResource * me.getItemBase().getBaseValue();
|
||||
} else{
|
||||
me.magicValue = 100000;
|
||||
me.magicValue = 1000000;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -289,6 +292,7 @@ public class Contract extends AbstractGameObject {
|
||||
me.magicValue = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return this.sellInventory;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.TargetColor;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector3fImmutable;
|
||||
@@ -117,6 +118,11 @@ public class Experience {
|
||||
159932666, // Level 74
|
||||
169707808, // Level 75
|
||||
179921247, // Level 76
|
||||
190585732, // Level 77
|
||||
201714185, // Level 78
|
||||
213319687, // Level 79
|
||||
225415457, // Level 80
|
||||
238014819 // Level 81
|
||||
|
||||
};
|
||||
|
||||
@@ -214,7 +220,14 @@ public class Experience {
|
||||
235166.21f, // Level 72
|
||||
246039.34f, // Level 73
|
||||
257240.58f, // Level 74
|
||||
1 // 268774.71 //Level 75
|
||||
268774.71f, //Level 75
|
||||
280647.69f, // Level 76
|
||||
292865.22f, // Level 77
|
||||
305433.33f, // Level 78
|
||||
318358.08f, // Level 79
|
||||
|
||||
// R8
|
||||
1 //331645.74f // Level 80
|
||||
|
||||
};
|
||||
// Used to calcuate the amount of experience a monster grants in the
|
||||
@@ -268,8 +281,8 @@ public class Experience {
|
||||
if (level < 1)
|
||||
level = 1;
|
||||
|
||||
if (level > 75)
|
||||
level = 75;
|
||||
if (level > MBServerStatics.LEVELCAP)
|
||||
level = MBServerStatics.LEVELCAP;
|
||||
|
||||
return MaxExpPerLevel[level];
|
||||
}
|
||||
@@ -279,17 +292,17 @@ public class Experience {
|
||||
|
||||
switch (TargetColor.getCon(pc, mob)) {
|
||||
case Red:
|
||||
return 1.25;
|
||||
return 1.1;
|
||||
case Orange:
|
||||
return 1.15;
|
||||
case Yellow:
|
||||
return 1.05;
|
||||
return 1.2;
|
||||
case Blue:
|
||||
return 1;
|
||||
return 1.25;
|
||||
case Cyan:
|
||||
return 0.8;
|
||||
return 0.9;
|
||||
case Green:
|
||||
return 0.5;
|
||||
return 0.7;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -383,6 +396,9 @@ public class Experience {
|
||||
if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP)
|
||||
continue;
|
||||
|
||||
if(playerCharacter.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
||||
continue; // cannot PVE higher than level 75
|
||||
|
||||
// Sets Max XP with server exp mod taken into account.
|
||||
|
||||
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
|
||||
@@ -428,12 +444,15 @@ public class Experience {
|
||||
}
|
||||
|
||||
} else { // Give EXP to a single character
|
||||
if (!killer.isAlive()) // Skip if the player is dead.
|
||||
return;
|
||||
//if (!killer.isAlive()) // Skip if the player is dead.
|
||||
// return;
|
||||
|
||||
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
|
||||
return;
|
||||
|
||||
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
||||
return;
|
||||
|
||||
// Get XP and adjust for Mob Level with world xp modifier taken into account
|
||||
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel());
|
||||
grantedExperience *= getConMod(killer, mob);
|
||||
|
||||
@@ -521,6 +521,10 @@ public class Guild extends AbstractWorldObject {
|
||||
public void setICMOTD(String value) {
|
||||
this.icmotd = value;
|
||||
}
|
||||
public void setNMOTD(String value) {
|
||||
this.nmotd = value;
|
||||
}
|
||||
public String getNMOTD(){return nmotd;}
|
||||
|
||||
public boolean isNPCGuild() {
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import engine.net.client.ClientConnection;
|
||||
import engine.net.client.msg.DeleteItemMsg;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
|
||||
import engine.powers.poweractions.AbstractPowerAction;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
@@ -816,8 +817,29 @@ public class Item extends AbstractWorldObject {
|
||||
return ownerID;
|
||||
}
|
||||
|
||||
public void stripCastableEnchants(){
|
||||
ArrayList<String> keys =new ArrayList<>();
|
||||
|
||||
for(String eff : this.effects.keySet()){
|
||||
for(AbstractEffectModifier mod : this.effects.get(eff).getEffectsBase().getModifiers()){
|
||||
if(mod.modType.equals(ModType.WeaponProc)){
|
||||
keys.add(eff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(String eff : keys){
|
||||
try {
|
||||
this.effects.get(eff).endEffect();
|
||||
this.effects.remove(eff);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//Only to be used for trading
|
||||
public void setOwnerID(int ownerID) {
|
||||
this.stripCastableEnchants();
|
||||
this.ownerID = ownerID;
|
||||
}
|
||||
|
||||
@@ -841,6 +863,7 @@ public class Item extends AbstractWorldObject {
|
||||
public boolean setOwner(AbstractGameObject owner) {
|
||||
if (owner == null)
|
||||
return false;
|
||||
this.stripCastableEnchants();
|
||||
if (owner.getObjectType().equals(GameObjectType.NPC))
|
||||
this.ownerType = OwnerType.Npc;
|
||||
else if (owner.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
@@ -1099,6 +1122,7 @@ public class Item extends AbstractWorldObject {
|
||||
this.ownerID = 0;
|
||||
this.ownerType = null;
|
||||
this.containerType = Enum.ItemContainerType.INVENTORY;
|
||||
this.stripCastableEnchants();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1249,7 +1273,9 @@ public class Item extends AbstractWorldObject {
|
||||
continue;
|
||||
}
|
||||
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||||
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
||||
|
||||
if(apa != null)
|
||||
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -220,16 +220,28 @@ public class ItemBase {
|
||||
AnniverseryGifts.add(971008);
|
||||
AnniverseryGifts.add(971009);
|
||||
AnniverseryGifts.add(971010);
|
||||
//AnniverseryGifts.add(5101000);
|
||||
//AnniverseryGifts.add(5101020);
|
||||
//AnniverseryGifts.add(5101100);
|
||||
//AnniverseryGifts.add(5101120);
|
||||
//AnniverseryGifts.add(5101040);
|
||||
//AnniverseryGifts.add(5101140);
|
||||
//AnniverseryGifts.add(5101060);
|
||||
//AnniverseryGifts.add(5101080);
|
||||
|
||||
AnniverseryGifts.add(5101000);
|
||||
AnniverseryGifts.add(5101020);
|
||||
AnniverseryGifts.add(5101100);
|
||||
AnniverseryGifts.add(5101120);
|
||||
AnniverseryGifts.add(5101040);
|
||||
AnniverseryGifts.add(5101140);
|
||||
AnniverseryGifts.add(5101060);
|
||||
AnniverseryGifts.add(5101080);
|
||||
|
||||
//fate peddler presents
|
||||
AnniverseryGifts.add(971012);
|
||||
AnniverseryGifts.add(971013);
|
||||
AnniverseryGifts.add(971014);
|
||||
AnniverseryGifts.add(971015);
|
||||
AnniverseryGifts.add(971016);
|
||||
AnniverseryGifts.add(971017);
|
||||
AnniverseryGifts.add(971018);
|
||||
AnniverseryGifts.add(971019);
|
||||
AnniverseryGifts.add(971020);
|
||||
AnniverseryGifts.add(971021);
|
||||
AnniverseryGifts.add(971022);
|
||||
AnniverseryGifts.add(971023);
|
||||
}
|
||||
|
||||
public static int getDiscPrice(int uuid) {
|
||||
|
||||
@@ -73,7 +73,7 @@ public class ItemFactory {
|
||||
itemManager.updateInventory();
|
||||
}
|
||||
|
||||
public static Item fillForge(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
|
||||
public static Item ResourceRoll(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
|
||||
|
||||
String prefixString = "";
|
||||
String suffixString = "";
|
||||
@@ -707,7 +707,7 @@ public class ItemFactory {
|
||||
|
||||
if (rollPrefix < 80) {
|
||||
|
||||
int randomPrefix = LootManager.TableRoll(vendor.getLevel(), false);
|
||||
int randomPrefix = TableRoll(vendor.getLevel());
|
||||
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
|
||||
|
||||
if (prefixEntry != null)
|
||||
@@ -722,7 +722,7 @@ public class ItemFactory {
|
||||
|
||||
if (rollSuffix < 80 || prefixEntry == null) {
|
||||
|
||||
int randomSuffix = LootManager.TableRoll(vendor.getLevel(), false);
|
||||
int randomSuffix = TableRoll(vendor.getLevel());
|
||||
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
|
||||
|
||||
if (suffixEntry != null)
|
||||
@@ -774,6 +774,43 @@ public class ItemFactory {
|
||||
return toRoll;
|
||||
}
|
||||
|
||||
public static int TableRoll(int vendorLevel) {
|
||||
// Calculate min and max based on mobLevel
|
||||
int min = 60;
|
||||
int max = 120;
|
||||
switch(vendorLevel){
|
||||
case 20:
|
||||
min = 70;
|
||||
max = 140;
|
||||
break;
|
||||
case 30:
|
||||
min = 80;
|
||||
max = 160;
|
||||
break;
|
||||
case 40:
|
||||
min = 90;
|
||||
max = 180;
|
||||
break;
|
||||
case 50:
|
||||
min = 100;
|
||||
max = 200;
|
||||
break;
|
||||
case 60:
|
||||
min = 175;
|
||||
max = 260;
|
||||
break;
|
||||
case 70:
|
||||
min = 220;
|
||||
max = 320;
|
||||
break;
|
||||
}
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||
|
||||
return roll;
|
||||
}
|
||||
|
||||
|
||||
public static MobLoot produceRandomRoll(NPC npc, PlayerCharacter pc, String prefixString, String suffixString, int itemID) {
|
||||
|
||||
boolean useWarehouse = false;
|
||||
@@ -885,8 +922,8 @@ public class ItemFactory {
|
||||
|
||||
ItemBase goldIB = ItemBase.getGoldItemBase();
|
||||
|
||||
int baseCost = ib.getBaseValue();
|
||||
int total = (int) (baseCost + baseCost * .10);
|
||||
//int baseCost = ib.getBaseValue();
|
||||
int total = ib.getBaseValue();
|
||||
|
||||
EffectsBase suffix = null;
|
||||
|
||||
|
||||
@@ -10,8 +10,11 @@
|
||||
package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.*;
|
||||
import engine.math.Vector3f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.net.ByteBufferWriter;
|
||||
import engine.net.client.msg.ErrorPopupMsg;
|
||||
import engine.server.MBServerStatics;
|
||||
@@ -58,6 +61,11 @@ public class Mine extends AbstractGameObject {
|
||||
public final HashSet<Integer> _playerMemory = new HashSet<>();
|
||||
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
|
||||
|
||||
//stronghold stuff
|
||||
public boolean isStronghold = false;
|
||||
public ArrayList<Mob> strongholdMobs;
|
||||
public HashMap<Integer,Integer> oldBuildings;
|
||||
|
||||
/**
|
||||
* ResultSet Constructor
|
||||
*/
|
||||
@@ -158,8 +166,10 @@ public class Mine extends AbstractGameObject {
|
||||
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
|
||||
|
||||
for (Mine mine : serverMines) {
|
||||
Mine.mineMap.put(mine, mine.buildingID);
|
||||
Mine.towerMap.put(mine.buildingID, mine);
|
||||
if(mine.capSize != 0) {
|
||||
Mine.mineMap.put(mine, mine.buildingID);
|
||||
Mine.towerMap.put(mine.buildingID, mine);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
@@ -180,9 +190,15 @@ public class Mine extends AbstractGameObject {
|
||||
writer.putInt(mine.getObjectType().ordinal());
|
||||
writer.putInt(mine.getObjectUUID());
|
||||
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
|
||||
writer.putString(mine.mineType.name);
|
||||
if(mine.isStronghold){
|
||||
writer.putString("STRONGHOLD");
|
||||
writer.putString("");
|
||||
}else {
|
||||
writer.putString(mine.mineType.name);
|
||||
writer.putString(mine.capSize + " Man ");
|
||||
}
|
||||
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
|
||||
writer.putString(mine.capSize + " Man ");
|
||||
|
||||
writer.putInt(mine.production.hash);
|
||||
writer.putInt(mine.production.baseProduction);
|
||||
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
|
||||
@@ -208,10 +224,17 @@ public class Mine extends AbstractGameObject {
|
||||
|
||||
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
|
||||
|
||||
writer.putString(mine.guildName);
|
||||
GuildTag._serializeForDisplay(mine.guildTag, writer);
|
||||
writer.putString(mine.nationName);
|
||||
GuildTag._serializeForDisplay(mine.nationTag, writer);
|
||||
if (mine.isStronghold) {
|
||||
writer.putString("");
|
||||
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
|
||||
writer.putString("");
|
||||
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
|
||||
}else {
|
||||
writer.putString(mine.guildName);
|
||||
GuildTag._serializeForDisplay(mine.guildTag, writer);
|
||||
writer.putString(mine.nationName);
|
||||
GuildTag._serializeForDisplay(mine.nationTag, writer);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error("Failed TO Serialize Mine Because: " + e.getMessage());
|
||||
}
|
||||
@@ -224,8 +247,7 @@ public class Mine extends AbstractGameObject {
|
||||
// Only inactive mines are returned.
|
||||
|
||||
for (Mine mine : Mine.mineMap.keySet()) {
|
||||
if (mine.owningGuild.getObjectUUID() == guildID &&
|
||||
mine.isActive == false)
|
||||
if (mine.owningGuild.getObjectUUID() == guildID)
|
||||
mineList.add(mine);
|
||||
}
|
||||
return mineList;
|
||||
@@ -378,9 +400,11 @@ public class Mine extends AbstractGameObject {
|
||||
}
|
||||
|
||||
public boolean validForMine(Resource r) {
|
||||
if (this.mineType == null)
|
||||
if (this.mineType == null) {
|
||||
Logger.error("Mine Was Null Setting Resources for Mine: " + this.getObjectUUID());
|
||||
return false;
|
||||
return this.mineType.validForMine(r, this.isExpansion());
|
||||
}
|
||||
return this.mineType.validForMine(r);
|
||||
}
|
||||
|
||||
public void serializeForMineProduction(ByteBufferWriter writer) {
|
||||
@@ -391,7 +415,7 @@ public class Mine extends AbstractGameObject {
|
||||
writer.putString(this.mineType.name);
|
||||
writer.putString(this.zoneName);
|
||||
writer.putInt(this.production.hash);
|
||||
writer.putInt(this.production.baseProduction);
|
||||
writer.putInt(this.getModifiedProductionAmount());
|
||||
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
|
||||
writer.putInt(3600); //window in seconds
|
||||
writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash);
|
||||
|
||||
@@ -13,21 +13,19 @@ import java.util.HashMap;
|
||||
|
||||
public enum MineProduction {
|
||||
|
||||
LUMBER("Lumber Camp", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
|
||||
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
|
||||
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
|
||||
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
|
||||
LUMBER("Lumber Camp", new HashMap<>(), 1618637196, 1663491950),
|
||||
ORE("Ore Mine", new HashMap<>(), 518103023, -788976428),
|
||||
MAGIC("Magic Mine", new HashMap<>(), 504746863, -1753567069),
|
||||
GOLDMINE("Gold Mine", new HashMap<>(), -662193002, -1227205358);
|
||||
|
||||
public final String name;
|
||||
public final HashMap<Integer, Resource> resources;
|
||||
public final Resource xpac;
|
||||
public final int hash;
|
||||
public final int xpacHash;
|
||||
|
||||
MineProduction(String name, HashMap<Integer, Resource> resources, Resource xpac, int hash, int xpacHash) {
|
||||
MineProduction(String name, HashMap<Integer, Resource> resources,int hash, int xpacHash) {
|
||||
this.name = name;
|
||||
this.resources = resources;
|
||||
this.xpac = xpac;
|
||||
this.hash = hash;
|
||||
this.xpacHash = xpacHash;
|
||||
}
|
||||
@@ -39,6 +37,7 @@ public enum MineProduction {
|
||||
MineProduction.LUMBER.resources.put(1580005, Resource.OAK);
|
||||
MineProduction.LUMBER.resources.put(1580006, Resource.BRONZEWOOD);
|
||||
MineProduction.LUMBER.resources.put(1580007, Resource.MANDRAKE);
|
||||
MineProduction.LUMBER.resources.put(1580018, Resource.WORMWOOD);
|
||||
}
|
||||
if (MineProduction.ORE.resources.size() == 0) {
|
||||
MineProduction.ORE.resources.put(7, Resource.GOLD);
|
||||
@@ -46,14 +45,16 @@ public enum MineProduction {
|
||||
MineProduction.ORE.resources.put(1580001, Resource.TRUESTEEL);
|
||||
MineProduction.ORE.resources.put(1580002, Resource.IRON);
|
||||
MineProduction.ORE.resources.put(1580003, Resource.ADAMANT);
|
||||
MineProduction.ORE.resources.put(1580019, Resource.OBSIDIAN);
|
||||
}
|
||||
if (MineProduction.GOLD.resources.size() == 0) {
|
||||
MineProduction.GOLD.resources.put(7, Resource.GOLD);
|
||||
MineProduction.GOLD.resources.put(1580000, Resource.STONE);
|
||||
MineProduction.GOLD.resources.put(1580008, Resource.COAL);
|
||||
MineProduction.GOLD.resources.put(1580009, Resource.AGATE);
|
||||
MineProduction.GOLD.resources.put(1580010, Resource.DIAMOND);
|
||||
MineProduction.GOLD.resources.put(1580011, Resource.ONYX);
|
||||
if (MineProduction.GOLDMINE.resources.size() == 0) {
|
||||
MineProduction.GOLDMINE.resources.put(7, Resource.GOLD);
|
||||
MineProduction.GOLDMINE.resources.put(1580000, Resource.STONE);
|
||||
MineProduction.GOLDMINE.resources.put(1580008, Resource.COAL);
|
||||
MineProduction.GOLDMINE.resources.put(1580009, Resource.AGATE);
|
||||
MineProduction.GOLDMINE.resources.put(1580010, Resource.DIAMOND);
|
||||
MineProduction.GOLDMINE.resources.put(1580011, Resource.ONYX);
|
||||
MineProduction.GOLDMINE.resources.put(1580017, Resource.GALVOR);
|
||||
}
|
||||
if (MineProduction.MAGIC.resources.size() == 0) {
|
||||
MineProduction.MAGIC.resources.put(7, Resource.GOLD);
|
||||
@@ -62,27 +63,25 @@ public enum MineProduction {
|
||||
MineProduction.MAGIC.resources.put(1580014, Resource.ANTIMONY);
|
||||
MineProduction.MAGIC.resources.put(1580015, Resource.SULFUR);
|
||||
MineProduction.MAGIC.resources.put(1580016, Resource.QUICKSILVER);
|
||||
MineProduction.MAGIC.resources.put(1580020, Resource.BLOODSTONE);
|
||||
}
|
||||
}
|
||||
|
||||
public static MineProduction getByName(String name) {
|
||||
if (name.toLowerCase().equals("lumber"))
|
||||
if (name.equalsIgnoreCase("lumber"))
|
||||
return MineProduction.LUMBER;
|
||||
else if (name.toLowerCase().equals("ore"))
|
||||
else if (name.equalsIgnoreCase("ore"))
|
||||
return MineProduction.ORE;
|
||||
else if (name.toLowerCase().equals("gold"))
|
||||
return MineProduction.GOLD;
|
||||
else if (name.equalsIgnoreCase("gold"))
|
||||
return MineProduction.GOLDMINE;
|
||||
else
|
||||
return MineProduction.MAGIC;
|
||||
}
|
||||
|
||||
public boolean validForMine(Resource r, boolean isXpac) {
|
||||
public boolean validForMine(Resource r) {
|
||||
if (r == null)
|
||||
return false;
|
||||
if (this.resources.containsKey(r.UUID))
|
||||
return true;
|
||||
else
|
||||
return isXpac && r.UUID == this.xpac.UUID;
|
||||
return this.resources.containsKey(r.UUID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+154
-28
@@ -101,6 +101,14 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
private DeferredPowerJob weaponPower;
|
||||
private DateTime upgradeDateTime = null;
|
||||
private boolean lootSync = false;
|
||||
public boolean StrongholdCommander = false;
|
||||
|
||||
public boolean StrongholdGuardian = false;
|
||||
|
||||
public Mine stronghold = null;
|
||||
|
||||
public boolean StrongholdEpic = false;
|
||||
public boolean isDropper = false;
|
||||
|
||||
|
||||
/**
|
||||
@@ -265,7 +273,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
|
||||
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
|
||||
this.firstName = rs.getString("mob_name");
|
||||
|
||||
this.isDropper = rs.getInt("is_dropper") == 1;
|
||||
if (this.firstName.isEmpty())
|
||||
this.firstName = this.mobBase.getFirstName();
|
||||
|
||||
@@ -289,6 +297,12 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
Logger.error("Mobile:" + this.dbID + ": " + e);
|
||||
}
|
||||
|
||||
if(this.firstName.toLowerCase().equals("guardian commander") || this.firstName.toLowerCase().equals("elite guardian")|| this.firstName.toLowerCase().equals("guardian")|| this.firstName.toLowerCase().equals("commander")){
|
||||
this.despawn();
|
||||
this.removeFromCache();
|
||||
DbManager.MobQueries.DELETE_MOB(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void serializeMobForClientMsgOtherPlayer(Mob mob, ByteBufferWriter writer) throws SerializationException {
|
||||
@@ -561,6 +575,32 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
return mob;
|
||||
}
|
||||
|
||||
public static Mob createStrongholdMob(int loadID, Vector3fImmutable spawn, Guild guild, boolean isMob, Zone parent, Building building, int contractID, String pirateName, int level) {
|
||||
|
||||
// Create a new Mob instance
|
||||
Mob mobWithoutID = new Mob(pirateName, "", (short) 0, (short) 0, (short) 0, (short) 0, (short) 0, (short) 1, 0, false, false, false, spawn, spawn, Vector3fImmutable.ZERO, (short) 1, (short) 1, (short) 1, guild, (byte) 0, loadID, isMob, parent, building, contractID);
|
||||
|
||||
// Check if mobBase is null
|
||||
if (mobWithoutID.mobBase == null)
|
||||
return null;
|
||||
|
||||
// Set mob level
|
||||
mobWithoutID.level = (short) level;
|
||||
|
||||
// Set the parent zone and parentZoneID
|
||||
mobWithoutID.parentZone = parent;
|
||||
mobWithoutID.parentZoneID = parent.getObjectUUID();
|
||||
|
||||
// If the mob is in a building, bind it to zero position
|
||||
if (mobWithoutID.building != null)
|
||||
mobWithoutID.bindLoc = Vector3fImmutable.ZERO;
|
||||
|
||||
// Avoid database actions and directly return the created mobWithoutID
|
||||
mobWithoutID.setObjectTypeMask(MBServerStatics.MASK_MOB | mobWithoutID.getTypeMasks());
|
||||
|
||||
return mobWithoutID;
|
||||
}
|
||||
|
||||
public static Mob createPet(int loadID, Guild guild, Zone parent, PlayerCharacter owner, short level) {
|
||||
MobBase mobBase = MobBase.getMobBase(loadID);
|
||||
Mob mob = null;
|
||||
@@ -1216,6 +1256,10 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
@Override
|
||||
public void killCharacter(AbstractCharacter attacker) {
|
||||
|
||||
if(this.StrongholdGuardian || this.StrongholdCommander) {
|
||||
ChatManager.chatSystemChannel(this.parentZone.getParent().getName() + "'s Stronghold Is Under Attack!");
|
||||
StrongholdManager.CheckToEndStronghold(this.stronghold);
|
||||
}
|
||||
|
||||
this.stopMovement(this.getMovementLoc());
|
||||
|
||||
@@ -1268,7 +1312,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
}
|
||||
|
||||
setLoc(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
this.region = Regions.GetRegionForTeleport(this.loc);//AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
//Next update will be end Loc, lets stop him here.
|
||||
|
||||
}
|
||||
@@ -1397,11 +1441,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
loadInventory();
|
||||
|
||||
this.updateLocation();
|
||||
|
||||
if(Mob.discDroppers.contains(this)){
|
||||
this.setLevel((short)65);
|
||||
this.setResists(new Resists("Dropper"));
|
||||
}
|
||||
}
|
||||
|
||||
public void despawn() {
|
||||
@@ -1410,6 +1449,10 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
WorldGrid.RemoveWorldObject(this);
|
||||
this.charItemManager.clearInventory();
|
||||
|
||||
if(this.StrongholdEpic && this.stronghold != null && this.stronghold.isActive)
|
||||
this.stronghold.isActive = false;
|
||||
//StrongholdManager.EndStronghold(this.stronghold);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1471,11 +1514,31 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
} catch (Exception e) {
|
||||
Logger.error(e.getMessage());
|
||||
}
|
||||
|
||||
//Resists.calculateResists(this);
|
||||
if(this.StrongholdCommander || this.StrongholdGuardian || this.StrongholdEpic){
|
||||
this.setResists(new Resists("Elite"));
|
||||
}else if(Mob.discDroppers.contains(this)) {
|
||||
this.setResists(new Resists("Dropper"));
|
||||
} else if(this.isDropper){
|
||||
this.setResists(new Resists("Dropper"));
|
||||
} else{
|
||||
this.setResists(new Resists());
|
||||
}
|
||||
this.resists.calculateResists(this, false);
|
||||
}
|
||||
|
||||
public void calculateMaxHealthManaStamina() {
|
||||
|
||||
if(this.StrongholdCommander){
|
||||
this.healthMax = 50000;
|
||||
return;
|
||||
} else if(this.StrongholdGuardian){
|
||||
this.healthMax = 12500;
|
||||
return;
|
||||
} else if(this.StrongholdEpic){
|
||||
this.healthMax = 250000;
|
||||
return;
|
||||
}
|
||||
|
||||
float h;
|
||||
float m;
|
||||
float s;
|
||||
@@ -1533,6 +1596,46 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
public void calculateAtrDefenseDamage() {
|
||||
|
||||
if(this.StrongholdCommander){
|
||||
this.maxDamageHandOne = 3500;
|
||||
this.minDamageHandOne = 1500;
|
||||
int atr = 3500;
|
||||
int defense = 3500;
|
||||
if (this.bonuses != null) {
|
||||
|
||||
defense = GetDefense(defense, this);
|
||||
atr = GetAttackRating(atr, this);
|
||||
}
|
||||
this.defenseRating = defense;
|
||||
this.atrHandOne = atr;
|
||||
return;
|
||||
} else if(this.StrongholdGuardian){
|
||||
this.maxDamageHandOne = 1550;
|
||||
this.minDamageHandOne = 750;
|
||||
int atr = 1800;
|
||||
int defense = 2200;
|
||||
if (this.bonuses != null) {
|
||||
|
||||
defense = GetDefense(defense, this);
|
||||
atr = GetAttackRating(atr, this);
|
||||
}
|
||||
this.defenseRating = defense;
|
||||
this.atrHandOne = atr;
|
||||
return;
|
||||
} else if(this.StrongholdEpic){
|
||||
this.maxDamageHandOne = 5000;
|
||||
this.minDamageHandOne = 2500;
|
||||
int atr = 5000;
|
||||
int defense = 3500;
|
||||
if (this.bonuses != null) {
|
||||
|
||||
defense = GetDefense(defense, this);
|
||||
atr = GetAttackRating(atr, this);
|
||||
}
|
||||
this.defenseRating = defense;
|
||||
this.atrHandOne = atr;
|
||||
return;
|
||||
}
|
||||
if (this.charItemManager == null || this.equip == null) {
|
||||
Logger.error("Player " + currentID + " missing skills or equipment");
|
||||
defaultAtrAndDamage(true);
|
||||
@@ -1545,7 +1648,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_MAINHAND), true);
|
||||
} catch (Exception e) {
|
||||
|
||||
this.atrHandOne = (short) this.mobBase.getAttackRating();
|
||||
this.atrHandOne = GetAttackRating(this.mobBase.getAttackRating(), this);
|
||||
this.minDamageHandOne = (short) this.mobBase.getMinDmg();
|
||||
this.maxDamageHandOne = (short) this.mobBase.getMaxDmg();
|
||||
this.rangeHandOne = 6.5f;
|
||||
@@ -1558,7 +1661,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
this.atrHandTwo = (short) this.mobBase.getAttackRating();
|
||||
this.atrHandTwo = GetAttackRating(this.mobBase.getAttackRating(), this);
|
||||
this.minDamageHandTwo = (short) this.mobBase.getMinDmg();
|
||||
this.maxDamageHandTwo = (short) this.mobBase.getMaxDmg();
|
||||
this.rangeHandTwo = 6.5f;
|
||||
@@ -1579,23 +1682,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
// TODO add error log here
|
||||
if (this.bonuses != null) {
|
||||
|
||||
// add any bonuses
|
||||
|
||||
defense += (short) this.bonuses.getFloat(ModType.DCV, SourceType.None);
|
||||
|
||||
// Finally, multiply any percent modifiers. DO THIS LAST!
|
||||
|
||||
float pos_Bonus = 1 + this.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
|
||||
|
||||
|
||||
defense = (short) (defense * pos_Bonus);
|
||||
|
||||
//Lucky rune applies next
|
||||
|
||||
float neg_Bonus = this.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
|
||||
defense = (short) (defense * (1 + neg_Bonus));
|
||||
|
||||
defense = GetDefense((int)defense, this);
|
||||
|
||||
} else
|
||||
Logger.error("Error: missing bonuses");
|
||||
@@ -1609,6 +1696,41 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
// calculate defense for equipment
|
||||
}
|
||||
|
||||
public static int GetDefense(int defense, Mob mob){
|
||||
// add any bonuses
|
||||
|
||||
defense += (short) mob.bonuses.getFloat(ModType.DCV, SourceType.None);
|
||||
|
||||
// Finally, multiply any percent modifiers. DO THIS LAST!
|
||||
|
||||
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
|
||||
|
||||
|
||||
defense = (short) (defense * pos_Bonus);
|
||||
|
||||
//Lucky rune applies next
|
||||
|
||||
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
|
||||
return (int) (defense * (1 + neg_Bonus));
|
||||
}
|
||||
|
||||
public static int GetAttackRating(int attackRating, Mob mob){
|
||||
// add any bonuses
|
||||
|
||||
attackRating += (short) mob.bonuses.getFloat(ModType.OCV, SourceType.None);
|
||||
|
||||
// Finally, multiply any percent modifiers. DO THIS LAST!
|
||||
|
||||
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.OCV, SourceType.None);
|
||||
|
||||
|
||||
attackRating = (short) (attackRating * pos_Bonus);
|
||||
|
||||
//Lucky rune applies next
|
||||
|
||||
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.OCV, SourceType.None);
|
||||
return (int) (attackRating * (1 + neg_Bonus));
|
||||
}
|
||||
private float getWeaponDefense(HashMap<Integer, MobEquipment> equipped) {
|
||||
|
||||
MobEquipment weapon = equipped.get(MBServerStatics.SLOT_MAINHAND);
|
||||
@@ -1935,6 +2057,10 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
this.charItemManager = new CharacterItemManager(this);
|
||||
this.loadInventory();
|
||||
if(this.isDropper){
|
||||
this.setLevel((short)65);
|
||||
this.setResists(new Resists("Dropper"));
|
||||
}
|
||||
try {
|
||||
if (this.equipmentSetID != 0)
|
||||
this.equip = MobBase.loadEquipmentSet(this.equipmentSetID);
|
||||
|
||||
+115
-3
@@ -122,7 +122,11 @@ public class NPC extends AbstractCharacter {
|
||||
// this.buyPercent = rs.getFloat("npc_buyPercent");
|
||||
|
||||
this.buyPercent = .33f;
|
||||
this.sellPercent = 1;
|
||||
if(ZoneManager.findSmallestZone(this.loc) != null && ZoneManager.findSmallestZone(this.loc).getSafeZone() == 1){
|
||||
this.sellPercent = 0;
|
||||
}else{
|
||||
this.sellPercent = 1;
|
||||
}
|
||||
|
||||
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
|
||||
|
||||
@@ -189,6 +193,18 @@ public class NPC extends AbstractCharacter {
|
||||
serializeForClientMsgOtherPlayer(npc, writer);
|
||||
}
|
||||
|
||||
public boolean isInSafeZone() {
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||
|
||||
if (zone != null) {
|
||||
return zone.getSafeZone() == (byte) 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
//return this.safeZone;
|
||||
}
|
||||
|
||||
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
|
||||
throws SerializationException {
|
||||
|
||||
@@ -1180,7 +1196,7 @@ public class NPC extends AbstractCharacter {
|
||||
}
|
||||
|
||||
// Cannot roll items without a warehouse.
|
||||
// Due to the fact fillForge references the
|
||||
// Due to the fact ResourceRoll references the
|
||||
// warehouse and early exits. *** Refactor???
|
||||
|
||||
serverZone = this.building.getParentZone();
|
||||
@@ -1214,7 +1230,7 @@ public class NPC extends AbstractCharacter {
|
||||
if (isRandom)
|
||||
item = ItemFactory.randomRoll(this, player, amount, itemID);
|
||||
else
|
||||
item = ItemFactory.fillForge(this, player, amount, itemID, pToken, sToken, customName);
|
||||
item = ItemFactory.ResourceRoll(this, player, amount, itemID, pToken, sToken, customName);
|
||||
|
||||
if (item == null)
|
||||
return null;
|
||||
@@ -1347,4 +1363,100 @@ public class NPC extends AbstractCharacter {
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<MobEquipment> getSellInventorySteward() {
|
||||
|
||||
ArrayList<MobEquipment> smallList = new ArrayList<>();
|
||||
for (MobEquipment me : this.contract.getSellInventory()) {
|
||||
int rankRequired = 0;
|
||||
if (me.getItemBase().getType().equals(Enum.ItemType.CONTRACT)) {
|
||||
switch (me.getItemBase().getUUID()) {
|
||||
case 866:
|
||||
case 889:
|
||||
case 860:
|
||||
case 850:
|
||||
case 892:
|
||||
case 1502003:
|
||||
case 890:
|
||||
case 896:
|
||||
rankRequired = 1;
|
||||
break;
|
||||
case 899:
|
||||
case 801:
|
||||
case 803:
|
||||
case 802:
|
||||
case 821:
|
||||
case 810:
|
||||
case 806:
|
||||
case 818:
|
||||
case 800:
|
||||
rankRequired = 2;
|
||||
break;
|
||||
|
||||
case 840:
|
||||
case 848:
|
||||
case 813:
|
||||
case 805:
|
||||
case 804:
|
||||
case 838:
|
||||
rankRequired = 3;
|
||||
break;
|
||||
case 815:
|
||||
rankRequired = 4;
|
||||
break;
|
||||
case 847:
|
||||
case 830:
|
||||
case 820:
|
||||
rankRequired = 6;
|
||||
break;
|
||||
case 865:
|
||||
case 252637:
|
||||
rankRequired = 7;
|
||||
break;
|
||||
case 1502002: // harvesters don't need to exist but might one day
|
||||
case 1502001: //mine guards don't need to exist but might one day
|
||||
continue;
|
||||
}
|
||||
if(me.getItemBase().getName().toLowerCase().contains("trainer") || me.getItemBase().getName().toLowerCase().contains("refiner")){
|
||||
rankRequired = 5;
|
||||
}
|
||||
if (this.getRank() >= rankRequired)
|
||||
smallList.add(me);
|
||||
}
|
||||
}
|
||||
return smallList;
|
||||
}
|
||||
|
||||
public ArrayList<MobEquipment> getSellInventoryBuilder() {
|
||||
|
||||
ArrayList<MobEquipment> smallList = new ArrayList<>();
|
||||
int maxValue = 0;
|
||||
switch(this.getRank()){
|
||||
case 1:
|
||||
maxValue = 300000;
|
||||
break;
|
||||
case 2:
|
||||
maxValue = 450000;
|
||||
break;
|
||||
case 3:
|
||||
maxValue = 550000;
|
||||
break;
|
||||
case 4:
|
||||
maxValue = 650000;
|
||||
break;
|
||||
case 5:
|
||||
maxValue = 1000000;
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
maxValue = 999999999;
|
||||
break;
|
||||
|
||||
}
|
||||
for(MobEquipment me : this.contract.getSellInventory()){
|
||||
if(me.getItemBase().getBaseValue() <= maxValue)
|
||||
smallList.add(me);
|
||||
}
|
||||
return smallList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import engine.job.JobScheduler;
|
||||
import engine.jobs.DeferredPowerJob;
|
||||
import engine.jobs.FinishSpireEffectJob;
|
||||
import engine.jobs.NoTimeJob;
|
||||
import engine.jobs.RefreshGroupJob;
|
||||
import engine.math.Bounds;
|
||||
import engine.math.FastMath;
|
||||
import engine.math.Vector3fImmutable;
|
||||
@@ -784,6 +785,9 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
// Verify Race
|
||||
int raceID = msg.getRace();
|
||||
|
||||
if(raceID == 0)
|
||||
raceID = 1999;
|
||||
|
||||
Race race = Race.getRace(raceID);
|
||||
|
||||
if (race == null) {
|
||||
@@ -816,33 +820,34 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Verify HairStyle/BeardStyle/SkinColor/HairColor/BeardColor
|
||||
int hairStyleID = msg.getHairStyle();
|
||||
int beardStyleID = msg.getBeardStyle();
|
||||
int skinColorID = msg.getSkinColor();
|
||||
int hairColorID = msg.getHairColor();
|
||||
int beardColorID = msg.getBeardColor();
|
||||
// Verify HairStyle/BeardStyle/SkinColor/HairColor/BeardColor
|
||||
int hairStyleID = msg.getHairStyle();
|
||||
int beardStyleID = msg.getBeardStyle();
|
||||
int skinColorID = msg.getSkinColor();
|
||||
int hairColorID = msg.getHairColor();
|
||||
int beardColorID = msg.getBeardColor();
|
||||
|
||||
if (!race.isValidHairStyle(hairStyleID)) {
|
||||
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
|
||||
return null;
|
||||
if(raceID != 1999) {
|
||||
if (!race.isValidHairStyle(hairStyleID)) {
|
||||
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!race.isValidSkinColor(skinColorID)) {
|
||||
Logger.info("Invalid skinColorID: " + skinColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!race.isValidHairColor(hairColorID)) {
|
||||
Logger.info("Invalid hairColorID: " + hairColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!race.isValidBeardColor(beardColorID)) {
|
||||
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!race.isValidSkinColor(skinColorID)) {
|
||||
Logger.info("Invalid skinColorID: " + skinColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!race.isValidHairColor(hairColorID)) {
|
||||
Logger.info("Invalid hairColorID: " + hairColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!race.isValidBeardColor(beardColorID)) {
|
||||
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get stat modifiers
|
||||
int strMod = msg.getStrengthMod();
|
||||
int dexMod = msg.getDexterityMod();
|
||||
@@ -930,11 +935,12 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
}
|
||||
|
||||
// Validate Rune against Race
|
||||
if (!race.isAllowedRune(runeBase)) {
|
||||
Logger.info("Trait Not valid for Race");
|
||||
return null;
|
||||
if(raceID != 1999) {
|
||||
if (!race.isAllowedRune(runeBase)) {
|
||||
Logger.info("Trait Not valid for Race");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate BaseClass against Race
|
||||
if (!baseClass.isAllowedRune(runeBase)) {
|
||||
Logger.info("Trait Not valid for BaseClass");
|
||||
@@ -1123,9 +1129,15 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
int kitID = msg.getKit();
|
||||
|
||||
// get the correctKit
|
||||
int raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
|
||||
int raceClassID;
|
||||
if(raceID != 1999){
|
||||
raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
|
||||
}else{
|
||||
raceClassID = Kit.GetKitIDByRaceClass(2011, baseClassID);
|
||||
}
|
||||
ArrayList<Kit> allKits = Kit.RaceClassIDMap.get(raceClassID);
|
||||
|
||||
|
||||
Kit kit = null;
|
||||
|
||||
for (Kit k : allKits) {
|
||||
@@ -1155,6 +1167,13 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
clientConnection);
|
||||
return null;
|
||||
}
|
||||
if(raceID == 1999){
|
||||
hairStyleID = 0;
|
||||
beardStyleID = 0;
|
||||
skinColorID = 0;
|
||||
hairColorID = 0;
|
||||
beardColorID = 0;
|
||||
}
|
||||
|
||||
// Make PC
|
||||
PlayerCharacter pcWithoutID = new PlayerCharacter(firstName, lastName, (short) strMod, (short) dexMod, (short) conMod,
|
||||
@@ -1829,20 +1848,20 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
//see if we shold grant xp to attacker
|
||||
boolean doPVPEXP = false;
|
||||
long lastKill = att.getLastKillOfTarget(this.getObjectUUID());
|
||||
if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
|
||||
if (attacker.getLevel() > 39 && this.getLevel() > 39) {
|
||||
Guild aN = null;
|
||||
Guild tN = null;
|
||||
if (attacker.getGuild() != null)
|
||||
aN = attacker.getGuild().getNation();
|
||||
if (this.getGuild() != null)
|
||||
tN = this.getGuild().getNation();
|
||||
if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
|
||||
//if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
|
||||
//if (attacker.getLevel() > 39 && this.getLevel() > 39) {
|
||||
//Guild aN = null;
|
||||
//Guild tN = null;
|
||||
//if (attacker.getGuild() != null)
|
||||
// aN = attacker.getGuild().getNation();
|
||||
//if (this.getGuild() != null)
|
||||
// tN = this.getGuild().getNation();
|
||||
//if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
|
||||
//skip giving xp if same guild or attacker is errant, or target is in death shroud.
|
||||
} else {
|
||||
//} else {
|
||||
doPVPEXP = true;
|
||||
}
|
||||
}
|
||||
//}
|
||||
// }
|
||||
//apply death shroud to non safeholds.
|
||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||
|
||||
@@ -4791,15 +4810,64 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void forceRespawn(PlayerCharacter sourcePlayer) throws MsgSendException {
|
||||
|
||||
if (sourcePlayer == null)
|
||||
return;
|
||||
|
||||
if (sourcePlayer.isAlive()) {
|
||||
Logger.error("Player " + sourcePlayer.getObjectUUID() + " respawning while alive");
|
||||
return;
|
||||
}
|
||||
// ResetAfterDeath player
|
||||
sourcePlayer.respawnLock.writeLock().lock();
|
||||
try {
|
||||
sourcePlayer.respawn(true, false, true);
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
} finally {
|
||||
sourcePlayer.respawnLock.writeLock().unlock();
|
||||
|
||||
}
|
||||
RespawnMsg msg = new RespawnMsg();
|
||||
// Echo ResetAfterDeath message back
|
||||
msg.setPlayerHealth(sourcePlayer.getHealth());
|
||||
// TODO calculate any experience loss before this point
|
||||
msg.setPlayerExp(sourcePlayer.getExp() + sourcePlayer.getOverFlowEXP());
|
||||
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
MoveToPointMsg moveMsg = new MoveToPointMsg();
|
||||
moveMsg.setPlayer(sourcePlayer);
|
||||
moveMsg.setStartCoord(sourcePlayer.getLoc());
|
||||
moveMsg.setEndCoord(sourcePlayer.getLoc());
|
||||
moveMsg.setInBuilding(-1);
|
||||
moveMsg.setUnknown01(-1);
|
||||
|
||||
dispatch = Dispatch.borrow(sourcePlayer, moveMsg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
MovementManager.sendRWSSMsg(sourcePlayer);
|
||||
|
||||
// refresh the whole group with what just happened
|
||||
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
if (this.updateLock.writeLock().tryLock()) {
|
||||
try {
|
||||
|
||||
if (!this.isAlive())
|
||||
if (!this.isAlive()) {
|
||||
if(!this.timestamps.containsKey("DeathTime")){
|
||||
this.timestamps.put("DeathTime",System.currentTimeMillis());
|
||||
}
|
||||
if((System.currentTimeMillis() - this.timestamps.get("DeathTime")) > 600000)
|
||||
forceRespawn(this);
|
||||
return;
|
||||
|
||||
}
|
||||
updateLocation();
|
||||
updateMovementState();
|
||||
updateRegen();
|
||||
@@ -4827,6 +4895,14 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
||||
}
|
||||
|
||||
if(this.isFlying()){
|
||||
//if (!AbstractCharacter.CanFly(this)) {
|
||||
if(this.effects.containsKey("MoveBuff")){
|
||||
GroundPlayer(this);
|
||||
//ChatManager.chatSystemInfo(this, "You Cannot Fly While Having A MovementBuff");
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
} finally {
|
||||
|
||||
@@ -150,6 +150,7 @@ public class PromotionClass extends AbstractGameObject {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,24 @@ public class Resists {
|
||||
private int protectionTrains = 0;
|
||||
private boolean immuneToAll;
|
||||
|
||||
public Resists() {
|
||||
this.immuneToAll = false;
|
||||
this.resists.put(DamageType.Slash, 0f);
|
||||
this.resists.put(DamageType.Crush, 0f);
|
||||
this.resists.put(DamageType.Pierce, 0f);
|
||||
this.resists.put(DamageType.Magic, 0f);
|
||||
this.resists.put(DamageType.Bleed, 0f);
|
||||
this.resists.put(DamageType.Poison, 0f);
|
||||
this.resists.put(DamageType.Mental, 0f);
|
||||
this.resists.put(DamageType.Holy, 0f);
|
||||
this.resists.put(DamageType.Unholy, 0f);
|
||||
this.resists.put(DamageType.Lightning, 0f);
|
||||
this.resists.put(DamageType.Fire, 0f);
|
||||
this.resists.put(DamageType.Cold, 0f);
|
||||
this.resists.put(DamageType.Healing, 0f);
|
||||
this.immuneTo.put(DamageType.Siege, true);
|
||||
|
||||
}
|
||||
/**
|
||||
* Generic Constructor
|
||||
*/
|
||||
@@ -49,6 +67,9 @@ public class Resists {
|
||||
case "Dropper":
|
||||
setDropperResists();
|
||||
break;
|
||||
case "Elite":
|
||||
setEliteResists();
|
||||
break;
|
||||
default:
|
||||
setGenericResists();
|
||||
break;
|
||||
@@ -252,6 +273,24 @@ public class Resists {
|
||||
this.immuneTo.put(DamageType.Siege, true);
|
||||
}
|
||||
|
||||
public final void setEliteResists() {
|
||||
this.immuneToAll = false;
|
||||
this.resists.put(DamageType.Slash, 75f);
|
||||
this.resists.put(DamageType.Crush, 75f);
|
||||
this.resists.put(DamageType.Pierce, 75f);
|
||||
this.resists.put(DamageType.Magic, 75f);
|
||||
this.resists.put(DamageType.Bleed, 75f);
|
||||
this.resists.put(DamageType.Poison, 75f);
|
||||
this.resists.put(DamageType.Mental, 75f);
|
||||
this.resists.put(DamageType.Holy, 75f);
|
||||
this.resists.put(DamageType.Unholy, 75f);
|
||||
this.resists.put(DamageType.Lightning, 75f);
|
||||
this.resists.put(DamageType.Fire, 75f);
|
||||
this.resists.put(DamageType.Cold, 75f);
|
||||
this.resists.put(DamageType.Healing, 0f);
|
||||
this.immuneTo.put(DamageType.Siege, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create generic resists
|
||||
*/
|
||||
@@ -415,7 +454,7 @@ public class Resists {
|
||||
*/
|
||||
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
|
||||
//handle fortitudes
|
||||
damage = handleFortitude(target, type, damage);
|
||||
//damage = handleFortitude(target, type, damage);
|
||||
//calculate armor piercing
|
||||
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
|
||||
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
|
||||
@@ -438,6 +477,7 @@ public class Resists {
|
||||
}
|
||||
target.cancelOnTakeDamage(type, (damageAfterResists));
|
||||
}
|
||||
damageAfterResists = handleFortitude(target, type, damageAfterResists);
|
||||
return damageAfterResists;
|
||||
}
|
||||
|
||||
@@ -447,6 +487,38 @@ public class Resists {
|
||||
// get resists for runes
|
||||
PlayerBonuses rb = ac.getBonuses();
|
||||
float slash = 0f, crush = 0f, pierce = 0f, magic = 0f, bleed = 0f, mental = 0f, holy = 0f, unholy = 0f, poison = 0f, lightning = 0f, fire = 0f, cold = 0f, healing = 0f;
|
||||
if(ac.getObjectType().equals(Enum.GameObjectType.Mob)){
|
||||
Mob mob = (Mob)ac;
|
||||
if(mob.StrongholdEpic || mob.StrongholdCommander || mob.StrongholdGuardian) {
|
||||
slash = 75f;
|
||||
crush = 75f;
|
||||
pierce = 75f;
|
||||
magic = 75f;
|
||||
bleed = 75f;
|
||||
mental = 75f;
|
||||
holy = 75f;
|
||||
unholy = 75f;
|
||||
poison = 75f;
|
||||
lightning = 75f;
|
||||
fire = 75f;
|
||||
cold = 75f;
|
||||
healing = 0f;
|
||||
} else if(Mob.discDroppers.contains(mob) || mob.isDropper) {
|
||||
slash = 200f;
|
||||
crush = 200f;
|
||||
pierce = 200f;
|
||||
magic = 200f;
|
||||
bleed = 200f;
|
||||
mental = 200f;
|
||||
holy = 200f;
|
||||
unholy = 200f;
|
||||
poison = 200f;
|
||||
lightning = 200f;
|
||||
fire = 200f;
|
||||
cold = 200f;
|
||||
healing = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (rb != null) {
|
||||
// Handle immunities
|
||||
@@ -486,19 +558,6 @@ public class Resists {
|
||||
cold += rb.getFloat(ModType.Resistance, SourceType.Cold);
|
||||
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name());
|
||||
|
||||
//HHO
|
||||
|
||||
// String protectionString = rb.getString("protection");
|
||||
//
|
||||
// if (protectionString.isEmpty())
|
||||
// this.protection = null;
|
||||
// else try {
|
||||
// this.protection = DamageType.valueOf(rb.getString("protection"));
|
||||
// } catch (IllegalArgumentException e) {
|
||||
// Logger.error( "No enum for: " + protectionString);
|
||||
// this.protection = null;
|
||||
// }
|
||||
// this.protectionTrains = rb.getFloat("protection");
|
||||
}
|
||||
|
||||
// get resists from equipment
|
||||
|
||||
@@ -112,8 +112,8 @@ public class Zone extends AbstractGameObject {
|
||||
|
||||
if (zone.playerCityID > 0) {
|
||||
writer.put((byte) 1); // Player City - True
|
||||
writer.putFloat(Enum.CityBoundsType.GRID.extents);
|
||||
writer.putFloat(Enum.CityBoundsType.GRID.extents);
|
||||
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
|
||||
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
|
||||
} else
|
||||
writer.put((byte) 0); // Player City - False
|
||||
|
||||
|
||||
@@ -45,13 +45,10 @@ public class RunegateTeleportPowerAction extends AbstractPowerAction {
|
||||
Vector3fImmutable rgLoc;
|
||||
|
||||
for (Runegate runegate : Runegate._runegates.values()) {
|
||||
|
||||
rgLoc = runegate.gateBuilding.getLoc();
|
||||
|
||||
float distanceToRunegateSquared = source.getLoc().distanceSquared2D(rgLoc);
|
||||
|
||||
if (distanceToRunegateSquared < sqr(dist)) {
|
||||
dist = sqrt(distanceToRunegateSquared);
|
||||
float disToGate = source.getLoc().distanceSquared2D(rgLoc);
|
||||
if(disToGate < dist){
|
||||
dist = disToGate;
|
||||
rg = runegate.gateBuilding;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ public class StealPowerAction extends AbstractPowerAction {
|
||||
@Override
|
||||
protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) {
|
||||
|
||||
if (source == null || awo == null || !(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) || !(awo.getObjectType().equals(Enum.GameObjectType.Item)))
|
||||
if (source == null || awo == null || !(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)))
|
||||
return;
|
||||
|
||||
PlayerCharacter sourcePlayer = (PlayerCharacter) source;
|
||||
@@ -131,8 +131,23 @@ public class StealPowerAction extends AbstractPowerAction {
|
||||
//Handle target attacking back if in combat and has no other target
|
||||
CombatManager.handleRetaliate(ownerAC, sourcePlayer);
|
||||
|
||||
} else
|
||||
} else if (owner.getObjectType().equals(Enum.GameObjectType.Mob)){
|
||||
Mob ownerMob = (Mob) owner;
|
||||
|
||||
if (ownerMob.isSafeMode() || sourcePlayer.inSafeZone())
|
||||
return;
|
||||
|
||||
if (ownerMob.getLoc().distanceSquared(sourcePlayer.getLoc()) > sqr(MBServerStatics.LOOT_RANGE))
|
||||
return;
|
||||
|
||||
//mark thief and target as player aggressive
|
||||
sourcePlayer.setLastPlayerAttackTime();
|
||||
|
||||
//Handle target attacking back if in combat and has no other target
|
||||
CombatManager.handleRetaliate(ownerAC, sourcePlayer);
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
|
||||
ClientConnection origin = sourcePlayer.getClientConnection();
|
||||
|
||||
|
||||
@@ -357,7 +357,7 @@ public class MBServerStatics {
|
||||
public static final int COMBAT_SEND_DODGE = 20;
|
||||
public static final int COMBAT_SEND_BLOCK = 21;
|
||||
public static final int COMBAT_SEND_PARRY = 22;
|
||||
public static final short LEVELCAP = 75;
|
||||
public static final short LEVELCAP = 80;
|
||||
public static final int LEVEL_CON_WHITE = 7;
|
||||
public static final int RESPAWN_TIMER = 90 * 1000;
|
||||
public static final int DESPAWN_TIMER = 12 * 1000;
|
||||
|
||||
@@ -210,6 +210,8 @@ public class LoginServer {
|
||||
nextServerTime = LocalDateTime.now().plusSeconds(1);
|
||||
}
|
||||
|
||||
//load realm for the server pop creation screen
|
||||
|
||||
if (LocalDateTime.now().isAfter(nextDatabaseTime)) {
|
||||
String pop = SimulationManager.getPopulationString();
|
||||
Logger.info("Keepalive: " + pop);
|
||||
@@ -276,6 +278,8 @@ public class LoginServer {
|
||||
Logger.info("Loading All Guilds");
|
||||
DbManager.GuildQueries.GET_ALL_GUILDS();
|
||||
|
||||
Logger.info("Loading All Realms");
|
||||
Realm.loadAllRealms();
|
||||
|
||||
Logger.info("***Boot Successful***");
|
||||
return true;
|
||||
|
||||
@@ -57,6 +57,7 @@ import java.nio.file.Paths;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
|
||||
@@ -595,12 +596,16 @@ public class WorldServer {
|
||||
mobs = DbManager.MobQueries.GET_ALL_MOBS_FOR_ZONE(zone);
|
||||
|
||||
for (Mob m : mobs) {
|
||||
try{
|
||||
m.setObjectTypeMask(MBServerStatics.MASK_MOB | m.getTypeMasks());
|
||||
m.setLoc(m.getLoc());
|
||||
|
||||
//ADD GUARDS HERE.
|
||||
if (m.building != null && m.building.getBlueprint() != null && m.building.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK)
|
||||
DbManager.MobQueries.LOAD_PATROL_POINTS(m);
|
||||
} catch (Exception e) {
|
||||
Logger.error(m.getObjectUUID() + " returned an Error Message :" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
//Handle npc's
|
||||
@@ -671,6 +676,22 @@ public class WorldServer {
|
||||
delta = 60000;
|
||||
|
||||
}
|
||||
|
||||
//get additional logout timer for enemies nearby
|
||||
if(!playerCharacter.isInSafeZone()){
|
||||
HashSet<AbstractWorldObject> playersClose = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
|
||||
boolean enemiesClose = false;
|
||||
for(AbstractWorldObject awo : playersClose){
|
||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
||||
if(!pc.guild.getNation().equals(playerCharacter.guild.getNation()))
|
||||
enemiesClose = true;
|
||||
}
|
||||
if(enemiesClose){
|
||||
delta += 60000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
playerCharacter.stopMovement(playerCharacter.getLoc());
|
||||
UpdateStateMsg updateStateMsg = new UpdateStateMsg();
|
||||
updateStateMsg.setPlayer(playerCharacter);
|
||||
@@ -688,8 +709,7 @@ public class WorldServer {
|
||||
playerCharacter.getLoadedStaticObjects().clear();
|
||||
|
||||
LogoutCharacterJob logoutJob = new LogoutCharacterJob(playerCharacter, this);
|
||||
JobContainer jc = JobScheduler.getInstance().scheduleJob(logoutJob,
|
||||
System.currentTimeMillis() + delta);
|
||||
JobContainer jc = JobScheduler.getInstance().scheduleJob(logoutJob, System.currentTimeMillis() + delta);
|
||||
playerCharacter.getTimers().put("Logout", jc);
|
||||
playerCharacter.getTimestamps().put("logout", System.currentTimeMillis());
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ import org.pmw.tinylog.Logger;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import static engine.gameManager.StrongholdManager.EndStronghold;
|
||||
import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
|
||||
|
||||
public class HalfHourlyJobThread implements Runnable {
|
||||
@@ -39,12 +41,14 @@ public class HalfHourlyJobThread implements Runnable {
|
||||
try {
|
||||
|
||||
ArrayList<Mine> mines = Mine.getMines();
|
||||
|
||||
for(Mine mine : mines){
|
||||
if (mine.isStronghold)
|
||||
StrongholdManager.EndStronghold(mine);
|
||||
}
|
||||
for (Mine mine : mines) {
|
||||
try {
|
||||
|
||||
//handle mines opening on server reboot weird time interval
|
||||
if(LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
|
||||
if (LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
|
||||
if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) {
|
||||
HalfHourlyJobThread.mineWindowOpen(mine);
|
||||
continue;
|
||||
@@ -60,16 +64,20 @@ public class HalfHourlyJobThread implements Runnable {
|
||||
|
||||
// Close the mine if it reaches this far
|
||||
LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute);
|
||||
if(LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
|
||||
if (LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
|
||||
mineWindowClose(mine);
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.error("mineID: " + mine.getObjectUUID(), e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
//StrongholdManager.processStrongholds();
|
||||
} catch (Exception e) {
|
||||
Logger.error(e.toString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void mineWindowOpen(Mine mine) {
|
||||
|
||||
Reference in New Issue
Block a user