Compare commits
	
		
			665 Commits 
		
	
	
		
			master
			...
			lakebane-d
		
	
	
				 115 changed files with 7366 additions and 2337 deletions
			
			
		| @ -0,0 +1,63 @@@@ -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"; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,77 +0,0 @@@@ -1,77 +0,0 @@ | ||||
| // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||
| // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||
| // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||
| // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||
| // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||
| //      Magicbane Emulator Project © 2013 - 2022
 | ||||
| //                www.magicbane.com
 | ||||
| 
 | ||||
| 
 | ||||
| package engine.devcmd.cmds; | ||||
| 
 | ||||
| import engine.devcmd.AbstractDevCmd; | ||||
| import engine.gameManager.ZoneManager; | ||||
| import engine.objects.AbstractGameObject; | ||||
| import engine.objects.PlayerCharacter; | ||||
| 
 | ||||
| /** | ||||
|  * ./hotzone                      <- display the current hotzone & time remaining | ||||
|  * ./hotzone random               <- change hotzone to random new zone | ||||
|  */ | ||||
| 
 | ||||
| public class HotzoneCmd extends AbstractDevCmd { | ||||
| 
 | ||||
|     public HotzoneCmd() { | ||||
|         super("hotzone"); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     protected void _doCmd(PlayerCharacter playerCharacter, String[] words, | ||||
|                           AbstractGameObject target) { | ||||
| 
 | ||||
|         StringBuilder data = new StringBuilder(); | ||||
|         String outString; | ||||
| 
 | ||||
|         for (String s : words) { | ||||
|             data.append(s); | ||||
|             data.append(' '); | ||||
|         } | ||||
| 
 | ||||
|         String input = data.toString().trim(); | ||||
| 
 | ||||
|         if (input.length() == 0) { | ||||
|             outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; | ||||
|             outString += "Available hotZones: " + ZoneManager.availableHotZones(); | ||||
|             throwbackInfo(playerCharacter, outString); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (input.equalsIgnoreCase("random")) { | ||||
|             ZoneManager.generateAndSetRandomHotzone(); | ||||
|             outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; | ||||
|             outString += "Available hotZones: " + ZoneManager.availableHotZones(); | ||||
|             throwbackInfo(playerCharacter, outString); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (input.equalsIgnoreCase("reset")) { | ||||
|             ZoneManager.resetHotZones(); | ||||
|             throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones()); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     protected String _getHelpString() { | ||||
|         return "Use no arguments to see the current hotzone or \"random\" to change it randomly."; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     protected String _getUsageString() { | ||||
|         return "'./hotzone [random]"; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,168 @@@@ -0,0 +1,168 @@ | ||||
| package engine.gameManager; | ||||
| 
 | ||||
| import engine.Enum; | ||||
| import engine.InterestManagement.WorldGrid; | ||||
| import engine.exception.MsgSendException; | ||||
| import engine.math.Vector3f; | ||||
| import engine.math.Vector3fImmutable; | ||||
| import engine.objects.*; | ||||
| import engine.server.MBServerStatics; | ||||
| import org.pmw.tinylog.Logger; | ||||
| 
 | ||||
| import java.util.*; | ||||
| import java.util.concurrent.ThreadLocalRandom; | ||||
| 
 | ||||
| public class ArenaManager { | ||||
|     private static final List<Arena> activeArenas = new ArrayList<>(); | ||||
|     public static final List<PlayerCharacter> playerQueue = new ArrayList<>(); | ||||
|     public static Long pulseDelay = 180000L; | ||||
|     public static Long lastExecution = 0L; | ||||
| 
 | ||||
|     public static void pulseArenas() { | ||||
|         if(lastExecution == 0L){ | ||||
|             lastExecution = System.currentTimeMillis(); | ||||
|         } | ||||
| 
 | ||||
|         if(activeArenas.isEmpty() && playerQueue.isEmpty()) | ||||
|             return; | ||||
| 
 | ||||
|         Iterator<Arena> iterator = activeArenas.iterator(); | ||||
| 
 | ||||
|         while (iterator.hasNext()) { | ||||
|             Arena arena = iterator.next(); | ||||
|             if (arena.checkToComplete()) { | ||||
|                 iterator.remove(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if(lastExecution + pulseDelay > System.currentTimeMillis()) | ||||
|             return; | ||||
| 
 | ||||
|         lastExecution = System.currentTimeMillis(); | ||||
| 
 | ||||
|         while (playerQueue.size() > 1) { | ||||
|             createArena(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void joinQueue(PlayerCharacter player) { | ||||
|         if (!playerQueue.contains(player)) { | ||||
|             playerQueue.add(player); | ||||
|         } | ||||
|         for(PlayerCharacter pc : playerQueue){ | ||||
|             if(pc.equals(player)) | ||||
|                 continue; | ||||
|             ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued."); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void leaveQueue(PlayerCharacter player) { | ||||
|         playerQueue.remove(player); | ||||
|         for(PlayerCharacter pc : playerQueue){ | ||||
|             if(pc.equals(player)) | ||||
|                 continue; | ||||
|             ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued."); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static void createArena() { | ||||
|         if (playerQueue.size() > 1) { | ||||
| 
 | ||||
|             Collections.shuffle(playerQueue); | ||||
|             Arena newArena = new Arena(); | ||||
| 
 | ||||
|             //set starting time
 | ||||
|             newArena.startTime = System.currentTimeMillis(); | ||||
| 
 | ||||
|             //decide an arena location
 | ||||
|             newArena.loc = selectRandomArenaLocation(); | ||||
| 
 | ||||
|             // Assign players to the arena
 | ||||
|             newArena.player1 = playerQueue.remove(0); | ||||
|             newArena.player2 = playerQueue.remove(0); | ||||
| 
 | ||||
|             // Teleport players to the arena location
 | ||||
|             Zone sdr = ZoneManager.getZoneByUUID(656); | ||||
|             MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); | ||||
|             MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); | ||||
| 
 | ||||
|             // Add the new arena to the active arenas list
 | ||||
|             activeArenas.add(newArena); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){ | ||||
|         if (winner != null && loser != null) { | ||||
|             Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}", | ||||
|                     arena.player1.getName(), arena.player2.getName(), winner.getName()); | ||||
|         } else { | ||||
|             Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.", | ||||
|                     arena.player1.getName(), arena.player2.getName()); | ||||
|         } | ||||
|         // Teleport players to the arena location
 | ||||
|         Zone sdr = ZoneManager.getZoneByUUID(656); | ||||
|         MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); | ||||
|         MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         activeArenas.remove(arena); | ||||
| 
 | ||||
|         if(winner != null){ | ||||
|             ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!"); | ||||
|             //handle prize distribution
 | ||||
|             //ItemBase specialLoot = ItemBase.getItemBase(866);
 | ||||
|             //Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
 | ||||
|             //promoted.setNumOfItems(21235);
 | ||||
|             //promoted.setName("Special Banker(21235)");
 | ||||
|             //DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
 | ||||
|             //winner.getCharItemManager().addItemToInventory(promoted);
 | ||||
|             //winner.getCharItemManager().updateInventory();
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static Vector3fImmutable selectRandomArenaLocation() { | ||||
|         boolean locSet = false; | ||||
|         Vector3fImmutable loc = Vector3fImmutable.ZERO; | ||||
| 
 | ||||
|         while (!locSet) { | ||||
|             try { | ||||
|                 float x = ThreadLocalRandom.current().nextInt(114300, 123600); | ||||
|                 float z = ThreadLocalRandom.current().nextInt(82675, 91700); | ||||
|                 float y = 0; // Y coordinate is always 0
 | ||||
| 
 | ||||
|                 loc = new Vector3fImmutable(x, y, z * -1); | ||||
|                 HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER); | ||||
|                 if(inRange.isEmpty() && !isUnderWater(loc)) | ||||
|                     locSet = true; | ||||
|                 //}
 | ||||
|             }catch(Exception e){ | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return loc; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isUnderWater(Vector3fImmutable loc) { | ||||
| 
 | ||||
|         try { | ||||
| 
 | ||||
|             Zone zone = ZoneManager.findSmallestZone(loc); | ||||
| 
 | ||||
|             if (zone.getSeaLevel() != 0) { | ||||
| 
 | ||||
|                 float localAltitude = loc.y; | ||||
|                 if (localAltitude < zone.getSeaLevel()) | ||||
|                     return true; | ||||
|             } else { | ||||
|                 if (loc.y < 0) | ||||
|                     return true; | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,347 @@@@ -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; | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,195 @@@@ -0,0 +1,195 @@ | ||||
| package engine.gameManager; | ||||
| import engine.objects.Guild; | ||||
| public class ZergManager { | ||||
| 
 | ||||
|     public static float getCurrentMultiplier(int count, int maxCount){ | ||||
|         switch(maxCount) { | ||||
|             case 3: return getMultiplier3Man(count); | ||||
|             case 5: return getMultiplier5Man(count); | ||||
|             case 10: return getMultiplier10Man(count); | ||||
|             case 20: return getMultiplier20Man(count); | ||||
|             case 30: return getMultiplier30Man(count); | ||||
|             case 40: return getMultiplier40Man(count); | ||||
|             default: return 1.0f; //unlimited
 | ||||
|         } | ||||
|     } | ||||
|     public static float getMultiplier3Man(int count) { | ||||
|         if(count < 4) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 6) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch(count){ | ||||
|             case 4: return 0.63f; | ||||
|             case 5: return 0.40f; | ||||
|             case 6: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
|     } | ||||
|     public static float getMultiplier5Man(int count) { | ||||
|         if(count < 6) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 10) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch(count){ | ||||
|             case 6: return 0.75f; | ||||
|             case 7: return 0.57f; | ||||
|             case 8: return 0.44f; | ||||
|             case 9: return 0.33f; | ||||
|             case 10: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
|     } | ||||
|     public static float getMultiplier10Man(int count) { | ||||
|         if(count < 11) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 20) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch(count){ | ||||
|             case 11: return 0.86f; | ||||
|             case 12: return 0.75f; | ||||
|             case 13: return 0.65f; | ||||
|             case 14: return 0.57f; | ||||
|             case 15: return 0.50f; | ||||
|             case 16: return 0.44f; | ||||
|             case 17: return 0.38f; | ||||
|             case 18: return 0.33f; | ||||
|             case 19: return 0.29f; | ||||
|             case 20: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
|     } | ||||
|     public static float getMultiplier20Man(int count) { | ||||
|         if(count < 21) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 40) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch (count) | ||||
|         { | ||||
|             case 21: return 0.93f; | ||||
|             case 22: return 0.86f; | ||||
|             case 23: return 0.80f; | ||||
|             case 24: return 0.75f; | ||||
|             case 25: return 0.70f; | ||||
|             case 26: return 0.65f; | ||||
|             case 27: return 0.61f; | ||||
|             case 28: return 0.57f; | ||||
|             case 29: return 0.53f; | ||||
|             case 30: return 0.50f; | ||||
|             case 31: return 0.47f; | ||||
|             case 32: return 0.44f; | ||||
|             case 33: return 0.41f; | ||||
|             case 34: return 0.38f; | ||||
|             case 35: return 0.36f; | ||||
|             case 36: return 0.33f; | ||||
|             case 37: return 0.31f; | ||||
|             case 38: return 0.29f; | ||||
|             case 39: return 0.27f; | ||||
|             case 40: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|     public static float getMultiplier30Man(int count) { | ||||
|         if(count < 31) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 60) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch (count) | ||||
|         { | ||||
|             case 31: return 0.95f; | ||||
|             case 32: return 0.91f; | ||||
|             case 33: return 0.86f; | ||||
|             case 34: return 0.82f; | ||||
|             case 35: return 0.79f; | ||||
|             case 36: return 0.75f; | ||||
|             case 37: return 0.72f; | ||||
|             case 38: return 0.68f; | ||||
|             case 39: return 0.65f; | ||||
|             case 40: return 0.63f; | ||||
|             case 41: return 0.60f; | ||||
|             case 42: return 0.57f; | ||||
|             case 43: return 0.55f; | ||||
|             case 44: return 0.52f; | ||||
|             case 45: return 0.50f; | ||||
|             case 46: return 0.48f; | ||||
|             case 47: return 0.46f; | ||||
|             case 48: return 0.44f; | ||||
|             case 49: return 0.42f; | ||||
|             case 50: return 0.40f; | ||||
|             case 51: return 0.38f; | ||||
|             case 52: return 0.37f; | ||||
|             case 53: return 0.35f; | ||||
|             case 54: return 0.33f; | ||||
|             case 55: return 0.32f; | ||||
|             case 56: return 0.30f; | ||||
|             case 57: return 0.29f; | ||||
|             case 58: return 0.28f; | ||||
|             case 59: return 0.26f; | ||||
|             case 60: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|     public static float getMultiplier40Man(int count) { | ||||
|         if(count < 41) | ||||
|             return 1.0f; | ||||
| 
 | ||||
|         if(count > 80) | ||||
|             return 0.0f; | ||||
| 
 | ||||
|         switch (count) | ||||
|         { | ||||
|             case 41: return 0.96f; | ||||
|             case 42: return 0.93f; | ||||
|             case 43: return 0.90f; | ||||
|             case 44: return 0.86f; | ||||
|             case 45: return 0.83f; | ||||
|             case 46: return 0.80f; | ||||
|             case 47: return 0.78f; | ||||
|             case 48: return 0.75f; | ||||
|             case 49: return 0.72f; | ||||
|             case 50: return 0.70f; | ||||
|             case 51: return 0.68f; | ||||
|             case 52: return 0.65f; | ||||
|             case 53: return 0.63f; | ||||
|             case 54: return 0.61f; | ||||
|             case 55: return 0.59f; | ||||
|             case 56: return 0.57f; | ||||
|             case 57: return 0.55f; | ||||
|             case 58: return 0.53f; | ||||
|             case 59: return 0.52f; | ||||
|             case 60: return 0.50f; | ||||
|             case 61: return 0.48f; | ||||
|             case 62: return 0.47f; | ||||
|             case 63: return 0.45f; | ||||
|             case 64: return 0.44f; | ||||
|             case 65: return 0.42f; | ||||
|             case 66: return 0.41f; | ||||
|             case 67: return 0.40f; | ||||
|             case 68: return 0.38f; | ||||
|             case 69: return 0.37f; | ||||
|             case 70: return 0.36f; | ||||
|             case 71: return 0.35f; | ||||
|             case 72: return 0.33f; | ||||
|             case 73: return 0.32f; | ||||
|             case 74: return 0.31f; | ||||
|             case 75: return 0.30f; | ||||
|             case 76: return 0.29f; | ||||
|             case 77: return 0.28f; | ||||
|             case 78: return 0.27f; | ||||
|             case 79: return 0.26f; | ||||
|             case 80: return 0.25f; | ||||
|             default: return 1.0f; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,82 @@@@ -0,0 +1,82 @@ | ||||
| package engine.objects; | ||||
| 
 | ||||
| import engine.InterestManagement.WorldGrid; | ||||
| import engine.gameManager.ArenaManager; | ||||
| import engine.gameManager.ChatManager; | ||||
| import engine.gameManager.MovementManager; | ||||
| import engine.math.Vector3fImmutable; | ||||
| import engine.server.MBServerStatics; | ||||
| 
 | ||||
| import java.util.HashSet; | ||||
| 
 | ||||
| public class Arena { | ||||
|     public PlayerCharacter player1; | ||||
|     public PlayerCharacter player2; | ||||
|     public Long startTime; | ||||
|     public Vector3fImmutable loc; | ||||
| 
 | ||||
|     public Arena(){ | ||||
| 
 | ||||
|     } | ||||
|     public Boolean disqualify() { | ||||
|         HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER); | ||||
|         HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER); | ||||
|         for(AbstractWorldObject obj : warningRange){ | ||||
|             PlayerCharacter pc = (PlayerCharacter)obj; | ||||
|             if(pc.equals(this.player1) || pc.equals(this.player2)) | ||||
|                 continue; | ||||
| 
 | ||||
|             ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!"); | ||||
|         } | ||||
|         //boot out all non competitors
 | ||||
|         for(AbstractWorldObject obj : inRange){ | ||||
|             if(obj.equals(this.player1)) | ||||
|                 continue; | ||||
| 
 | ||||
|             if(obj.equals(this.player2)) | ||||
|                 continue; | ||||
| 
 | ||||
|             PlayerCharacter intruder = (PlayerCharacter)obj; | ||||
|             MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079))); | ||||
|         } | ||||
| 
 | ||||
|         if (!inRange.contains(this.player1) && inRange.contains(this.player2)) { | ||||
|             ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena"); | ||||
|             return true; | ||||
|         } else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) { | ||||
|             ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena"); | ||||
|             return true; | ||||
|         }else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) { | ||||
|             ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena"); | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     public Boolean checkToComplete(){ | ||||
| 
 | ||||
|         if(this.startTime == null) | ||||
|             this.startTime = System.currentTimeMillis(); | ||||
| 
 | ||||
|         if(System.currentTimeMillis() - this.startTime < 10000L) | ||||
|             return false; | ||||
| 
 | ||||
|         if(this.disqualify()) | ||||
|             return true; | ||||
| 
 | ||||
|         if(!this.player1.isAlive() && this.player2.isAlive()){ | ||||
|             ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died"); | ||||
|             return true; | ||||
|         } else if(this.player1.isAlive() && !this.player2.isAlive()){ | ||||
|             ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died"); | ||||
|             return true; | ||||
|         } else if(!this.player1.isAlive() && !this.player2.isAlive()){ | ||||
|             ArenaManager.endArena(this,null,null,"Both Players Have Died"); | ||||
|             return true; | ||||
|         } else if(this.startTime + 300000L < System.currentTimeMillis()){ | ||||
|             ArenaManager.endArena(this,null,null,"Time Has Elapsed"); | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						| @ -0,0 +1,752 @@@@ -0,0 +1,752 @@ | ||||
| package engine.objects; | ||||
| 
 | ||||
| import engine.Enum; | ||||
| import engine.powers.effectmodifiers.AbstractEffectModifier; | ||||
| import engine.server.MBServerStatics; | ||||
| import org.pmw.tinylog.Logger; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| 
 | ||||
| public class PlayerCombatStats { | ||||
| 
 | ||||
|     public PlayerCharacter owner; | ||||
|     //main hand data
 | ||||
|     public int minDamageHandOne; | ||||
|     public int maxDamageHandOne; | ||||
|     public float attackSpeedHandOne; | ||||
|     public float rangeHandOne; | ||||
|     public float atrHandOne; | ||||
|     //off hand data
 | ||||
|     public int minDamageHandTwo; | ||||
|     public int maxDamageHandTwo; | ||||
|     public float attackSpeedHandTwo; | ||||
|     public float rangeHandTwo; | ||||
|     public float atrHandTwo; | ||||
|     //defense
 | ||||
|     public int defense; | ||||
|     //regen rates
 | ||||
|     public float healthRegen; | ||||
|     public float manaRegen; | ||||
|     public float staminaRegen; | ||||
| 
 | ||||
|     public PlayerCombatStats(PlayerCharacter pc) { | ||||
|         this.owner = pc; | ||||
|         this.update(); | ||||
|     } | ||||
| 
 | ||||
|     public void update() { | ||||
|         try { | ||||
|             this.calculateATR(true); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE ATR FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateATR(false); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE ATR FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateMin(true); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Min FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateMin(false); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Min FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateMax(true); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Max FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateMax(false); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Max FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateAttackSpeed(true); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Attack Speed FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateAttackSpeed(false); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Attack Speed FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateAttackRange(true); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Attack Range FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateAttackRange(false); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Attack Range FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateRegen(); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Regen FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|         try { | ||||
|             this.calculateDefense(); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("FAILED TO CALCULATE Defense FOR: " + this.owner.getObjectUUID()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateATR(boolean mainHand) { | ||||
|         Item weapon; | ||||
|         float atr; | ||||
| 
 | ||||
|         if(mainHand) { | ||||
|             weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         }else { | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
| 
 | ||||
|         String skill = "Unarmed Combat"; | ||||
|         String mastery = "Unarmed Combat Mastery"; | ||||
|         int primaryStat = getDexAfterPenalty(this.owner); | ||||
|         if(weapon != null) { | ||||
|             skill= weapon.getItemBase().getSkillRequired(); | ||||
|             mastery = weapon.getItemBase().getMastery(); | ||||
|             if(weapon.getItemBase().isStrBased()) | ||||
|                 primaryStat = this.owner.statStrCurrent; | ||||
|         } | ||||
| 
 | ||||
|         float skillLevel = 0; | ||||
|         float masteryLevel = 0; | ||||
| 
 | ||||
|         if(this.owner.skills.containsKey(skill)) { | ||||
|             skillLevel = this.owner.skills.get(skill).getModifiedAmount(); | ||||
|         } | ||||
|         if(this.owner.skills.containsKey(mastery)) | ||||
|             masteryLevel = this.owner.skills.get(mastery).getModifiedAmount(); | ||||
| 
 | ||||
|         float stanceValue = 0.0f; | ||||
|         float atrEnchants = 0; | ||||
| 
 | ||||
|         for(String effID : this.owner.effects.keySet()) { | ||||
|             if (effID.contains("Stance")) { | ||||
|                 for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { | ||||
|                     if (mod.modType.equals(Enum.ModType.OCV)) { | ||||
|                         float percent = mod.getPercentMod(); | ||||
|                         int trains = this.owner.effects.get(effID).getTrains(); | ||||
|                         float modValue = percent + (trains * mod.getRamp()); | ||||
|                         stanceValue += modValue * 0.01f; | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { | ||||
|                     if (mod.modType.equals(Enum.ModType.OCV)) { | ||||
|                         float value = mod.getMinMod(); | ||||
|                         int trains = this.owner.effects.get(effID).getTrains(); | ||||
|                         float modValue = value + (trains * mod.getRamp()); | ||||
|                         atrEnchants += modValue; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         float prefixValues = 0.0f; | ||||
|         if(weapon != null){ | ||||
|             if(this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 for(Effect eff : this.owner.charItemManager.getEquipped(1).effects.values()){ | ||||
|                     for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                         if(mod.modType.equals(Enum.ModType.OCV)){ | ||||
|                             prefixValues += mod.minMod + (eff.getTrains() * mod.getRamp()); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if(this.owner.charItemManager.getEquipped(2) != null){ | ||||
|             for(Effect eff : this.owner.charItemManager.getEquipped(2).effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.OCV)){ | ||||
|                         prefixValues += mod.minMod + (eff.getTrains() * mod.getRamp()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         float preciseRune = 1.0f; | ||||
|         for(CharacterRune rune : this.owner.runes){ | ||||
|             if(rune.getRuneBase().getName().equals("Precise")) | ||||
|                 preciseRune += 0.05f; | ||||
|         } | ||||
| 
 | ||||
|         if(weapon != null && weapon.getItemBase().isStrBased()){ | ||||
|             atr = (((primaryStat / 2) + (skillLevel * 4 + masteryLevel * 3) + prefixValues) * preciseRune + atrEnchants) * (1.0f + stanceValue); | ||||
|             atr = (float) Math.round(atr); | ||||
|         }else { | ||||
|             float dexterity = getDexAfterPenalty(this.owner); | ||||
|             atr = dexterity / 2; | ||||
|             atr += skillLevel * 4; | ||||
|             atr += masteryLevel * 3; | ||||
|             atr += prefixValues; | ||||
|             atr *= preciseRune; | ||||
|             atr += atrEnchants; | ||||
|             atr *= 1.0f + stanceValue; | ||||
|             atr = (float) Math.round(atr); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         if(mainHand){ | ||||
|             this.atrHandOne = atr; | ||||
|         }else{ | ||||
|             this.atrHandTwo = atr; | ||||
|             if(this.owner.charItemManager.getEquipped(1) == null && this.owner.charItemManager.getEquipped(2) != null){ | ||||
|                 if(!this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|                     this.atrHandOne = 0.0f; | ||||
|             }else if(this.owner.charItemManager.getEquipped(2) == null && this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 this.atrHandTwo = 0.0f; | ||||
|             } | ||||
|         } | ||||
|     } //perfect DO NOT TOUCH
 | ||||
| 
 | ||||
|     public void calculateMin(boolean mainHand) { | ||||
|         Item weapon; | ||||
|         float specialDex = this.owner.statDexBase; | ||||
|         specialDex += this.owner.bonuses.getFloat(Enum.ModType.Attr, Enum.SourceType.Dexterity); | ||||
|         float baseDMG = 1; | ||||
|         float primaryStat = specialDex;//getDexAfterPenalty(this.owner);
 | ||||
|         float secondaryStat = this.owner.statStrCurrent; | ||||
|         double weaponSkill = 5; | ||||
|         double weaponMastery = 5; | ||||
| 
 | ||||
|         if (mainHand) { | ||||
|             weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         } else { | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
| 
 | ||||
|         String skill = "Unarmed Combat"; | ||||
|         String mastery = "Unarmed Combat Mastery"; | ||||
| 
 | ||||
|         if (weapon != null) { | ||||
|             baseDMG = weapon.getItemBase().getMinDamage(); | ||||
|             skill = weapon.getItemBase().getSkillRequired(); | ||||
|             mastery = weapon.getItemBase().getMastery(); | ||||
|             if (weapon.getItemBase().isStrBased()) { | ||||
|                 primaryStat = this.owner.statStrCurrent; | ||||
|                 secondaryStat = specialDex;//getDexAfterPenalty(this.owner);
 | ||||
|             } | ||||
|             for(Effect eff : weapon.effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.MinDamage)){ | ||||
|                         baseDMG += mod.minMod + (mod.getRamp() * eff.getTrains()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (this.owner.skills.containsKey(skill)) { | ||||
|             weaponSkill = this.owner.skills.get(skill).getTotalSkillPercet(); | ||||
|         } | ||||
| 
 | ||||
|         if (this.owner.skills.containsKey(mastery)) { | ||||
|             weaponMastery = this.owner.skills.get(mastery).getTotalSkillPercet(); | ||||
|         } | ||||
| 
 | ||||
|         double minDMG = baseDMG * ( | ||||
|                 0.0048 * primaryStat + | ||||
|                         0.049 * Math.sqrt(primaryStat - 0.75) + | ||||
|                         0.0066 * secondaryStat + | ||||
|                         0.064 * Math.sqrt(secondaryStat - 0.75) + | ||||
|                         0.01 * (weaponSkill + weaponMastery) | ||||
|         ); | ||||
|         if(this.owner.bonuses != null){ | ||||
|             minDMG += this.owner.bonuses.getFloat(Enum.ModType.MinDamage, Enum.SourceType.None); | ||||
|             minDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None); | ||||
|         } | ||||
| 
 | ||||
|         if(this.owner.charItemManager != null){ | ||||
|             if(this.owner.charItemManager.getEquipped(1) != null && this.owner.charItemManager.getEquipped(2) != null && !this.owner.charItemManager.getEquipped(2).getItemBase().isShield()){ | ||||
|                 minDMG *= 0.7f; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         int roundedMin = (int)Math.round(minDMG); | ||||
| 
 | ||||
|         if (mainHand) { | ||||
|             this.minDamageHandOne = roundedMin; | ||||
|         } else { | ||||
|             this.minDamageHandTwo = roundedMin; | ||||
|             if(this.owner.charItemManager.getEquipped(1) == null && this.owner.charItemManager.getEquipped(2) != null){ | ||||
|                 if(!this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|                     this.minDamageHandOne = 0; | ||||
|             }else if(this.owner.charItemManager.getEquipped(2) == null && this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 this.minDamageHandTwo = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateMax(boolean mainHand) { | ||||
|         //Weapon Max DMG = BaseDMG * (0.0124*Primary Stat + 0.118*(Primary Stat -0.75)^0.5
 | ||||
|         // + 0.0022*Secondary Stat + 0.028*(Secondary Stat-0.75)^0.5 + 0.0075*(Weapon Skill + Weapon Mastery))
 | ||||
|         Item weapon; | ||||
|         float specialDex = this.owner.statDexBase; | ||||
|         specialDex += this.owner.bonuses.getFloat(Enum.ModType.Attr, Enum.SourceType.Dexterity); | ||||
|         double baseDMG = 5; | ||||
|         float primaryStat = specialDex;//getDexAfterPenalty(this.owner);
 | ||||
|         float secondaryStat = this.owner.statStrCurrent; | ||||
|         double weaponSkill = 5; | ||||
|         double weaponMastery = 5; | ||||
| 
 | ||||
| 
 | ||||
|         if (mainHand) { | ||||
|             weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         } else { | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
| 
 | ||||
|         String skill = "Unarmed Combat"; | ||||
|         String mastery = "Unarmed Combat Mastery"; | ||||
|         if (weapon != null) { | ||||
|             baseDMG = weapon.getItemBase().getMaxDamage(); | ||||
|             skill = weapon.getItemBase().getSkillRequired(); | ||||
|             mastery = weapon.getItemBase().getMastery(); | ||||
|             if (weapon.getItemBase().isStrBased()) { | ||||
|                 primaryStat = this.owner.statStrCurrent; | ||||
|                 secondaryStat = specialDex;//getDexAfterPenalty(this.owner);
 | ||||
|             } | ||||
|             for(Effect eff : weapon.effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.MaxDamage)){ | ||||
|                         baseDMG += mod.minMod + (mod.getRamp() * eff.getTrains()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (this.owner.skills.containsKey(skill)) { | ||||
|             weaponSkill = this.owner.skills.get(skill).getModifiedAmount(); | ||||
|         } | ||||
| 
 | ||||
|         if (this.owner.skills.containsKey(mastery)) { | ||||
|             weaponMastery = this.owner.skills.get(mastery).getModifiedAmount(); | ||||
|         } | ||||
| 
 | ||||
|         double maxDMG = baseDMG * ( | ||||
|                 0.0124 * primaryStat + | ||||
|                         0.118 * Math.sqrt(primaryStat - 0.75) + | ||||
|                         0.0022 * secondaryStat + | ||||
|                         0.028 * Math.sqrt(secondaryStat - 0.75) + | ||||
|                         0.0075 * (weaponSkill + weaponMastery) | ||||
|         ); | ||||
| 
 | ||||
|         if(this.owner.bonuses != null){ | ||||
|             maxDMG += this.owner.bonuses.getFloat(Enum.ModType.MaxDamage, Enum.SourceType.None); | ||||
|             maxDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None); | ||||
|         } | ||||
| 
 | ||||
|         if(this.owner.charItemManager != null){ | ||||
|             if(this.owner.charItemManager.getEquipped(1) != null && this.owner.charItemManager.getEquipped(2) != null && !this.owner.charItemManager.getEquipped(2).getItemBase().isShield()){ | ||||
|                 maxDMG *= 0.7f; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         int roundedMax = (int)(maxDMG); | ||||
| 
 | ||||
|         if(mainHand){ | ||||
|             this.maxDamageHandOne = roundedMax; | ||||
|         }else{ | ||||
|             this.maxDamageHandTwo = roundedMax; | ||||
|             if(this.owner.charItemManager.getEquipped(1) == null && this.owner.charItemManager.getEquipped(2) != null){ | ||||
|                 if(!this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|                     this.maxDamageHandOne = 0; | ||||
|             }else if(this.owner.charItemManager.getEquipped(2) == null && this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 this.maxDamageHandTwo = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateAttackSpeed(boolean mainHand){ | ||||
|         Item weapon; | ||||
|         float speed; | ||||
|         if(mainHand) { | ||||
|             weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         }else { | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
|         float delayExtra = 0; | ||||
|         if(weapon == null) { | ||||
|             speed = 20.0f; | ||||
|         }else{ | ||||
|             speed = weapon.getItemBase().getSpeed(); | ||||
|             for(Effect eff : weapon.effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.WeaponSpeed) || mod.modType.equals(Enum.ModType.AttackDelay)){ | ||||
|                         float percent = mod.getPercentMod(); | ||||
|                         int trains = eff.getTrains(); | ||||
|                         float modValue = percent + (trains * mod.getRamp()); | ||||
|                         speed *= 1 + (modValue * 0.01f); | ||||
|                         if(mod.modType.equals(Enum.ModType.AttackDelay)){ | ||||
|                             delayExtra += modValue * 0.01f; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         float stanceValue = 0.0f; | ||||
|         for(String effID : this.owner.effects.keySet()){ | ||||
|             if(effID.contains("Stance")){ | ||||
|                 if(this.owner.effects != null) { | ||||
|                     for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { | ||||
|                         if (mod.modType.equals(Enum.ModType.AttackDelay)) { | ||||
|                             float percent = mod.getPercentMod(); | ||||
|                             int trains = this.owner.effects.get(effID).getTrains(); | ||||
|                             float modValue = percent + (trains * mod.getRamp()); | ||||
|                             stanceValue += modValue * 0.01f; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         float bonusValues = 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.AttackDelay,Enum.SourceType.None);//1.0f;
 | ||||
|         bonusValues -= stanceValue + delayExtra; // take away stance modifier from alac bonus values
 | ||||
|         speed *= 1 + stanceValue; // apply stance bonus
 | ||||
|         speed *= bonusValues; // apply alac bonuses without stance mod
 | ||||
| 
 | ||||
|         if(speed < 10.0f) | ||||
|             speed = 10.0f; | ||||
| 
 | ||||
|         if(mainHand){ | ||||
|             this.attackSpeedHandOne = speed; | ||||
|         }else{ | ||||
|             this.attackSpeedHandTwo = speed; | ||||
|             if(this.owner.charItemManager.getEquipped(1) == null && this.owner.charItemManager.getEquipped(2) != null){ | ||||
|                 if(!this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|                     this.attackSpeedHandOne = 0.0f; | ||||
|             }else if(this.owner.charItemManager.getEquipped(2) == null && this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 this.attackSpeedHandTwo = 0.0f; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateAttackRange(boolean mainHand){ | ||||
|         Item weapon; | ||||
|         float range; | ||||
|         if(mainHand) { | ||||
|             weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         }else { | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
| 
 | ||||
|         if(weapon == null) { | ||||
|             range = 6.0f; | ||||
|         }else{ | ||||
|             range = weapon.getItemBase().getRange(); | ||||
|         } | ||||
|         if(owner.bonuses != null){ | ||||
|             range *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.WeaponRange, Enum.SourceType.None); | ||||
|         } | ||||
|         if(mainHand){ | ||||
|             this.rangeHandOne = range; | ||||
|         }else{ | ||||
|             this.rangeHandTwo = range; | ||||
|             if(this.owner.charItemManager.getEquipped(1) == null && this.owner.charItemManager.getEquipped(2) != null){ | ||||
|                 if(!this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|                     this.rangeHandOne = 0.0f; | ||||
|             }else if(this.owner.charItemManager.getEquipped(2) == null && this.owner.charItemManager.getEquipped(1) != null){ | ||||
|                 this.rangeHandTwo = 0.0f; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateRegen(){ | ||||
|         if(owner.bonuses != null){ | ||||
|             this.healthRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None); | ||||
|             this.manaRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.ManaRecoverRate, Enum.SourceType.None); | ||||
|             this.staminaRegen = 1.0f + this.owner.bonuses.getFloatPercentAll(Enum.ModType.StaminaRecoverRate, Enum.SourceType.None); | ||||
| 
 | ||||
|         }else{ | ||||
|             this.healthRegen = 1.0f; | ||||
|             this.manaRegen = 1.0f; | ||||
|             this.staminaRegen = 1.0f; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void calculateDefense() { | ||||
|         //Defense = (1+Armor skill / 50) * Armor defense + (1 + Block skill / 100) * Shield defense + (Primary weapon skill / 2)
 | ||||
|         // + (Weapon mastery skill/ 2) + Dexterity * 2 + Flat bonuses from rings or cloth
 | ||||
|         float armorSkill = 0.0f; | ||||
|         float armorDefense = 0.0f; | ||||
|         ArrayList<String> armorsUsed = new ArrayList<>(); | ||||
|         for(Item equipped : this.owner.charItemManager.getEquipped().values()){ | ||||
|             ItemBase ib = equipped.getItemBase(); | ||||
|             if(ib.isHeavyArmor() || ib.isMediumArmor() || ib.isLightArmor() || ib.isClothArmor()){ | ||||
|                 armorDefense += ib.getDefense(); | ||||
|                 for(Effect eff : equipped.effects.values()){ | ||||
|                     for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                         if(mod.modType.equals(Enum.ModType.DR)){ | ||||
|                             armorDefense += mod.minMod + (mod.getRamp() * eff.getTrains()); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if(!ib.isClothArmor() && !armorsUsed.contains(ib.getSkillRequired())) { | ||||
|                     armorsUsed.add(ib.getSkillRequired()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         for(String armorUsed : armorsUsed){ | ||||
|             if(this.owner.skills.containsKey(armorUsed)) { | ||||
|                 armorSkill += calculateModifiedSkill(armorUsed,this.owner); | ||||
|             } | ||||
|         } | ||||
|         if(armorsUsed.size() > 0) | ||||
|             armorSkill = armorSkill / armorsUsed.size(); | ||||
| 
 | ||||
|         float blockSkill = 0.0f; | ||||
|         if(this.owner.skills.containsKey("Block")) | ||||
|             blockSkill = calculateModifiedSkill("Block",this.owner); | ||||
| 
 | ||||
|         float shieldDefense = 0.0f; | ||||
|         if(this.owner.charItemManager.getEquipped(2) != null && this.owner.charItemManager.getEquipped(2).getItemBase().isShield()){ | ||||
|             Item shield = this.owner.charItemManager.getEquipped(2); | ||||
|             shieldDefense += shield.getItemBase().getDefense(); | ||||
|             for(Effect eff : shield.effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.DR)){ | ||||
|                         shieldDefense += mod.minMod + (mod.getRamp() * eff.getTrains()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         float weaponSkill = 0.0f; | ||||
|         float masterySkill = 0.0f; | ||||
|         Item weapon = this.owner.charItemManager.getEquipped(1); | ||||
|         if(weapon == null){ | ||||
|             weapon = this.owner.charItemManager.getEquipped(2); | ||||
|         } | ||||
|         if(weapon != null && weapon.getItemBase().isShield()) | ||||
|             weapon = null; | ||||
| 
 | ||||
|         String skillName = "Unarmed Combat"; | ||||
|         String masteryName = "Unarmed Combat Mastery"; | ||||
| 
 | ||||
|         if(weapon != null){ | ||||
|             skillName = weapon.getItemBase().getSkillRequired(); | ||||
|             masteryName = weapon.getItemBase().getMastery(); | ||||
|         } | ||||
|         if(this.owner.skills.containsKey(skillName)) | ||||
|             weaponSkill = this.owner.skills.get(skillName).getModifiedAmount();//calculateModifiedSkill(skillName,this.owner);//this.owner.skills.get(skillName).getModifiedAmount();
 | ||||
| 
 | ||||
|         if(this.owner.skills.containsKey(masteryName)) | ||||
|             masterySkill = this.owner.skills.get(masteryName).getModifiedAmount();//calculateModifiedSkill(masteryName,this.owner);//this.owner.skills.get(masteryName).getModifiedAmount();
 | ||||
| 
 | ||||
|         float dexterity = getDexAfterPenalty(this.owner); | ||||
| 
 | ||||
|         float luckyRune = 1.0f; | ||||
|         for(CharacterRune rune : this.owner.runes){ | ||||
|             if(rune.getRuneBase().getName().equals("Lucky")) | ||||
|                 luckyRune += 0.05f; | ||||
|         } | ||||
| 
 | ||||
|         float flatBonuses = 0.0f; | ||||
|         float stanceMod = 1.0f; | ||||
|         for(String effID : this.owner.effects.keySet()) { | ||||
|             if (effID.contains("Stance")) { | ||||
|                 for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { | ||||
|                     if (mod.modType.equals(Enum.ModType.DCV)) { | ||||
|                         float percent = mod.getPercentMod(); | ||||
|                         int trains = this.owner.effects.get(effID).getTrains(); | ||||
|                         float modValue = percent + (trains * mod.getRamp()); | ||||
|                         stanceMod += modValue * 0.01f; | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { | ||||
|                     if (mod.modType.equals(Enum.ModType.DCV)) { | ||||
|                         float value = mod.getMinMod(); | ||||
|                         int trains = this.owner.effects.get(effID).getTrains(); | ||||
|                         float modValue = value + (trains * mod.getRamp()); | ||||
|                         flatBonuses += modValue; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if(this.owner.charItemManager.getEquipped(2) == null) | ||||
|             blockSkill = 0; | ||||
|         else if(this.owner.charItemManager != null && this.owner.charItemManager.getEquipped(2) != null && !this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) | ||||
|             blockSkill = 0; | ||||
| 
 | ||||
|         //Defense = (1+Armor skill / 50) * Armor defense + (1 + Block skill / 100) * Shield defense
 | ||||
|         // + (Primary weapon skill / 2) + (Weapon mastery skill/ 2) + ROUND((Dexterity-Dex penalty),0) * 2 + Flat bonuses from rings or cloth
 | ||||
|         float defense = 0; | ||||
|         for(Item equipped : this.owner.charItemManager.getEquippedList()){ | ||||
|             ItemBase ib = equipped.getItemBase(); | ||||
|             if(ib.getType().equals(Enum.ItemType.ARMOR) && !ib.isShield()){ | ||||
|                 defense += getArmorDefense(equipped,this.owner); | ||||
|             } | ||||
|         } | ||||
|         //float defense = (1 + armorSkill / 50) * armorDefense;
 | ||||
|         defense += (1 + blockSkill / 100) * shieldDefense; | ||||
|         defense += (weaponSkill / 2); | ||||
|         defense += (masterySkill / 2); | ||||
|         defense += dexterity * 2; | ||||
|         defense += flatBonuses; | ||||
|         defense *= luckyRune; | ||||
|         defense *= stanceMod; | ||||
| 
 | ||||
|         defense = Math.round(defense); | ||||
| 
 | ||||
|         this.defense = (int) defense; | ||||
|     } | ||||
| 
 | ||||
|     public static float calculateModifiedSkill(String skillName, PlayerCharacter pc) { | ||||
| 
 | ||||
|         CharacterSkill skill = null; | ||||
|         if (pc.skills.containsKey(skillName)) { | ||||
|             skill = pc.skills.get(skillName); | ||||
|         } | ||||
|         SkillsBase skillBase = skill.getSkillsBase(); | ||||
|         if(skillBase == null) | ||||
|             return 0; | ||||
| 
 | ||||
|         //Get any rune bonus
 | ||||
|         float bonus = 0f; | ||||
|         if (pc.getBonuses() != null) { | ||||
|             //Get bonuses from runes
 | ||||
|             bonus = pc.getBonuses().getSkillBonus(skillBase.sourceType); | ||||
|         } | ||||
| 
 | ||||
|         //Get Base skill for modified stats
 | ||||
|         float base = 7f; | ||||
|         if(skillBase.getToken() == -660435875){ | ||||
|             base = 0; | ||||
|         } | ||||
|         float statMod = 0.5f; | ||||
|         if (skillBase.getStrMod() > 0) | ||||
|             statMod += (float) skillBase.getStrMod() * (float) pc.getStatStrCurrent() / 100f; | ||||
|         if (skillBase.getDexMod() > 0) | ||||
|             statMod += (float) skillBase.getDexMod() * (float) getDexAfterPenalty(pc) / 100f; | ||||
|         if (skillBase.getConMod() > 0) | ||||
|             statMod += (float) skillBase.getConMod() * (float) pc.getStatConCurrent() / 100f; | ||||
|         if (skillBase.getIntMod() > 0) | ||||
|             statMod += (float) skillBase.getIntMod() * (float) pc.getStatIntCurrent() / 100f; | ||||
|         if (skillBase.getSpiMod() > 0) | ||||
|             statMod += (float) skillBase.getSpiMod() * (float) pc.getStatSpiCurrent() / 100f; | ||||
| 
 | ||||
|         if (statMod < 1) | ||||
|             statMod = 1f; | ||||
| 
 | ||||
|         if(skillBase.getToken() == -660435875){ | ||||
|             statMod = 0; | ||||
|         } | ||||
|         base += CharacterSkill.baseSkillValues[(int) statMod]; | ||||
|         Enum.SourceType sourceType = Enum.SourceType.GetSourceType(skillBase.getNameNoSpace()); | ||||
| 
 | ||||
|         //Get any rune, effect and item bonus
 | ||||
| 
 | ||||
|         if (pc.getBonuses() != null) { | ||||
|             //add bonuses from effects/items and runes
 | ||||
|             base += bonus + pc.getBonuses().getFloat(Enum.ModType.Skill, sourceType); | ||||
|         } | ||||
|         float baseAmount; | ||||
|         if (base < 1f && skillBase.getToken() != -660435875) | ||||
|             baseAmount = 1f; | ||||
|         else | ||||
|             baseAmount = base; | ||||
| 
 | ||||
|         int amount; | ||||
| 
 | ||||
|         int trains = skill.getNumTrains(); | ||||
|         if (trains < 10) | ||||
|             amount = (trains * 2); | ||||
|         else if (trains < 90) | ||||
|             amount = 10 + trains; | ||||
|         else if (trains < 134) | ||||
|             amount = 100 + ((trains - 90) / 2); | ||||
|         else | ||||
|             amount = 122 + ((trains - 134) / 3); | ||||
| 
 | ||||
|         float modAmount = baseAmount + amount; | ||||
| 
 | ||||
|         if (pc.getBonuses() != null) { | ||||
|             //Multiply any percent bonuses
 | ||||
|             modAmount *= (1 + pc.getBonuses().getFloatPercentAll(Enum.ModType.Skill, sourceType)); | ||||
|         } | ||||
| 
 | ||||
|         float modifiedAmount = (float) Math.round(modAmount); | ||||
| 
 | ||||
|         return modifiedAmount; | ||||
|     } | ||||
| 
 | ||||
|     public static int getDexAfterPenalty(PlayerCharacter pc){ | ||||
|         if(pc.charItemManager == null) | ||||
|             return pc.statDexCurrent; | ||||
| 
 | ||||
|         float dex = pc.statDexBase; | ||||
|         if(pc.bonuses != null) | ||||
|             dex += pc.bonuses.getFloat(Enum.ModType.Attr, Enum.SourceType.Dexterity); | ||||
| 
 | ||||
|         float penaltyFactor = 0.0f; | ||||
|         for(Item equipped : pc.charItemManager.getEquipped().values()){ | ||||
|             ItemBase ib = equipped.getItemBase(); | ||||
|             if(ib.isHeavyArmor() || ib.isLightArmor() || ib.isMediumArmor()){ | ||||
|                 penaltyFactor += ib.dexReduction; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if(penaltyFactor > 0) | ||||
|             penaltyFactor *= 0.01f; | ||||
| 
 | ||||
|         float totalPenalty = dex *  penaltyFactor; | ||||
|         float returnedDex = Math.round(dex - totalPenalty); | ||||
|         return (int) returnedDex; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private static float getArmorDefense(Item armor, PlayerCharacter pc) { | ||||
| 
 | ||||
|         if (armor == null) | ||||
|             return 0; | ||||
| 
 | ||||
|         ItemBase ib = armor.getItemBase(); | ||||
| 
 | ||||
|         if (ib == null) | ||||
|             return 0; | ||||
| 
 | ||||
|         if (!ib.getType().equals(Enum.ItemType.ARMOR)) | ||||
|             return 0; | ||||
| 
 | ||||
|         if (ib.getSkillRequired().isEmpty()) | ||||
|             return ib.getDefense(); | ||||
| 
 | ||||
|         CharacterSkill armorSkill = pc.skills.get(ib.getSkillRequired()); | ||||
|         if (armorSkill == null) { | ||||
|             Logger.error("Player " + pc.getObjectUUID() | ||||
|                     + " has armor equipped without the nescessary skill to equip it"); | ||||
|             return ib.getDefense(); | ||||
|         } | ||||
| 
 | ||||
|         float def = ib.getDefense(); | ||||
|         //apply item defense bonuses
 | ||||
|         if (armor != null) { | ||||
| 
 | ||||
|             for(Effect eff : armor.effects.values()){ | ||||
|                 for(AbstractEffectModifier mod : eff.getEffectModifiers()){ | ||||
|                     if(mod.modType.equals(Enum.ModType.DR)){ | ||||
|                         def += mod.minMod * (1+(eff.getTrains() * mod.getRamp())); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             //def += armor.getBonus(ModType.DR, SourceType.None);
 | ||||
|             //def *= (1 + armor.getBonusPercent(ModType.DR, SourceType.None));
 | ||||
|         } | ||||
|         return (def * (1 + ((int) armorSkill.getModifiedAmount() / 50f))); | ||||
|     } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue