Compare commits

..

1 Commits

Author SHA1 Message Date
FatBoy 93d80c0005 split system mob AI 2025-02-23 20:44:56 -06:00
35 changed files with 1759 additions and 861 deletions
-150
View File
@@ -1,150 +0,0 @@
package engine.Dungeons;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.BuildingManager;
import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.net.ByteBufferWriter;
import engine.objects.*;
import engine.powers.EffectsBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
public class Dungeon {
public static int NoFlyEffectID = -1733819072;
public static int NoTeleportEffectID = -1971545187;
public static int NoSummonEffectID = 2122002462;
public ArrayList<PlayerCharacter> participants;
public int maxPerGuild;
public Vector3fImmutable entrance;
public ArrayList<Mob> dungeon_mobs;
public Long respawnTime = 0L;
public Dungeon(Vector3fImmutable entrance, int maxCount){
this.participants = new ArrayList<>();
this.entrance = entrance;
this.dungeon_mobs = new ArrayList<>();
this.maxPerGuild = maxCount;
}
public void applyDungeonEffects(PlayerCharacter player){
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID);
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID);
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID);
if(noFly != null)
player.addEffectNoTimer(noFly.getName(),noFly,40,true);
if(noTele != null)
player.addEffectNoTimer(noTele.getName(),noTele,40,true);
if(noSum != null)
player.addEffectNoTimer(noSum.getName(),noSum,40,true);
}
public void removeDungeonEffects(PlayerCharacter player) {
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID);
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID);
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID);
for (Effect eff : player.effects.values()) {
if (noFly != null && eff.getEffectsBase().equals(noFly))
eff.endEffect();
if (noTele != null && eff.getEffectsBase().equals(noTele))
eff.endEffect();
if (noSum != null && eff.getEffectsBase().equals(noSum))
eff.endEffect();
}
}
public static void serializeForClientMsgTeleport(ByteBufferWriter writer) {
Guild rulingGuild = Guild.getErrantGuild();
Guild rulingNation = Guild.getErrantGuild();
Zone zone = ZoneManager.getZoneByUUID(994);
// Begin Serialzing soverign guild data
writer.putInt(Enum.GameObjectType.Zone.ordinal());
writer.putInt(994);
writer.putString("Whitehorn Citadel");
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
writer.putString("Whitehorn Militants"); // guild name
writer.putString("In the Citadel, We Fight!"); // motto
writer.putString(rulingGuild.getLeadershipType());
// Serialize guild ruler's name
// If tree is abandoned blank out the name
// to allow them a rename.
writer.putString("Kol'roth The Destroyer");//sovreign
writer.putInt(rulingGuild.getCharter());
writer.putInt(0); // always 00000000
writer.put((byte)0);
writer.put((byte) 1);
writer.put((byte) 1); // *** Refactor: What are these flags?
writer.put((byte) 1);
writer.put((byte) 1);
writer.put((byte) 1);
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
writer.putInt(0);// TODO Implement description text
writer.put((byte) 1);
writer.put((byte) 0);
writer.put((byte) 1);
// Begin serializing nation guild info
if (rulingNation.isEmptyGuild()) {
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
} else {
writer.putInt(rulingNation.getObjectType().ordinal());
writer.putInt(rulingNation.getObjectUUID());
}
// Serialize nation name
writer.putString("Whitehorn Militants"); //nation name
writer.putInt(-1);//city rank, -1 puts it at top of list always
writer.putInt(0xFFFFFFFF);
writer.putInt(0);
writer.putString("Kol'roth The Destroyer");//nation ruler
writer.putLocalDateTime(LocalDateTime.now());
//location
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f);
writer.putFloat(loc.x);
writer.putFloat(loc.y);
writer.putFloat(loc.z);
writer.putInt(0);
writer.put((byte) 1);
writer.put((byte) 0);
writer.putInt(0x64);
writer.put((byte) 0);
writer.put((byte) 0);
writer.put((byte) 0);
}
}
-105
View File
@@ -1,105 +0,0 @@
package engine.Dungeons;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.powers.EffectsBase;
import engine.server.MBServerStatics;
import java.util.ArrayList;
import java.util.HashSet;
public class DungeonManager {
public static ArrayList<Dungeon> dungeons;
private static final float dungeonAiRange = 64f;
private static final float maxTravel = 64f;
public static void joinDungeon(PlayerCharacter pc, Dungeon dungeon){
if(requestEnter(pc,dungeon)) {
dungeon.participants.add(pc);
dungeon.applyDungeonEffects(pc);
translocateToDungeon(pc, dungeon);
}
}
public static void leaveDungeon(PlayerCharacter pc, Dungeon dungeon){
dungeon.participants.remove(pc);
dungeon.removeDungeonEffects(pc);
translocateOutOfDungeon(pc);
}
public static boolean requestEnter(PlayerCharacter pc, Dungeon dungeon){
int current = 0;
Guild nation = pc.guild.getNation();
if(nation == null)
return false;
for(PlayerCharacter participant : dungeon.participants){
if(participant.guild.getNation().equals(nation)){
current ++;
}
}
if(current >= dungeon.maxPerGuild)
return false;
return true;
}
public static void translocateToDungeon(PlayerCharacter pc, Dungeon dungeon){
pc.teleport(dungeon.entrance);
pc.setSafeMode();
}
public static void translocateOutOfDungeon(PlayerCharacter pc){
pc.teleport(pc.bindLoc);
pc.setSafeMode();
}
public static void pulse_dungeons(){
for(Dungeon dungeon : dungeons){
//early exit, if no players present don't waste resources
if(dungeon.participants.isEmpty())
continue;
if(dungeon.respawnTime > 0 && System.currentTimeMillis() > dungeon.respawnTime){
respawnMobs(dungeon);
}
//remove any players that have left
HashSet<AbstractWorldObject> obj = WorldGrid.getObjectsInRangePartial(dungeon.entrance,4096f,MBServerStatics.MASK_PLAYER);
for(PlayerCharacter player : dungeon.participants)
if(!obj.contains(player))
leaveDungeon(player,dungeon);
//cycle dungeon mob AI
for(Mob mob : dungeon.dungeon_mobs)
dungeonMobAI(mob);
}
}
public static void dungeonMobAI(Mob mob){
}
public static void respawnMobs(Dungeon dungeon){
for(Mob mob : dungeon.dungeon_mobs){
if(!mob.isAlive() && mob.despawned)
mob.respawn();
if(!mob.isAlive() && !mob.despawned){
mob.despawn();
mob.respawn();
}
}
}
}
@@ -511,18 +511,6 @@ public enum InterestManager implements Runnable {
if (player == null) if (player == null)
return; return;
for(PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()){
if(pc.equals(player)){
try{
WorldGrid.RemoveWorldObject(player);
}catch(Exception e){
}
}
}
ClientConnection origin = player.getClientConnection(); ClientConnection origin = player.getClientConnection();
if (origin == null) if (origin == null)
+4 -18
View File
@@ -19,7 +19,10 @@ import engine.objects.Account;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.*; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbAccountHandler extends dbHandlerBase { public class dbAccountHandler extends dbHandlerBase {
@@ -275,21 +278,4 @@ public class dbAccountHandler extends dbHandlerBase {
} }
} }
public void TRASH_CHEATERS() {
try (Connection connection = DbManager.getConnection();
CallableStatement callableStatement = connection.prepareCall("{CALL BanAccountsWithMachineID()}")) {
boolean hasResultSet = callableStatement.execute();
if (!hasResultSet && callableStatement.getUpdateCount() > 0) {
Logger.info("TRASHED CHEATERS");
} else {
Logger.warn("No cheaters to trash.");
}
} catch (SQLException e) {
Logger.error("Error trashing cheaters: ", e);
}
}
} }
-54
View File
@@ -1,54 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.Dungeons.DungeonManager;
import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.pmw.tinylog.Logger;
/**
* @author Eighty
*/
public class DungenonCmd extends AbstractDevCmd {
public DungenonCmd() {
super("dungeon");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
Zone parent = ZoneManager.findSmallestZone(pc.loc);
if(parent == null)
return;
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f);
pc.teleport(loc);
}
@Override
protected String _getHelpString() {
return "indicate mob or building followed by an id and a level";
}
@Override
protected String _getUsageString() {
return "'/dungeon mob 2001 10'";
}
}
+29 -64
View File
@@ -8,7 +8,6 @@
package engine.gameManager; package engine.gameManager;
import engine.Enum;
import engine.Enum.*; import engine.Enum.*;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.job.JobContainer; import engine.job.JobContainer;
@@ -304,9 +303,6 @@ public enum CombatManager {
//pet to assist in attacking target //pet to assist in attacking target
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){ if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter attacker = (PlayerCharacter)abstractCharacter; PlayerCharacter attacker = (PlayerCharacter)abstractCharacter;
if(attacker.combatStats == null){
attacker.combatStats = new PlayerCombatStats(attacker);
}
if(attacker.getPet() != null){ if(attacker.getPet() != null){
Mob pet = attacker.getPet(); Mob pet = attacker.getPet();
if(pet.combatTarget == null && pet.assist) if(pet.combatTarget == null && pet.assist)
@@ -330,13 +326,10 @@ public enum CombatManager {
else if (!tar.isActive()) else if (!tar.isActive())
return 0; return 0;
if (target.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getTimers().get("Attack" + slot) == null) { if (target.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) && abstractCharacter.getTimers().get("Attack" + slot) == null)
if(((PlayerCharacter)target).combatStats == null){
((PlayerCharacter)target).combatStats = new PlayerCombatStats(((PlayerCharacter)target));
}
if (!((PlayerCharacter) abstractCharacter).canSee((PlayerCharacter) target)) if (!((PlayerCharacter) abstractCharacter).canSee((PlayerCharacter) target))
return 0; return 0;
}
//must not be immune to all or immune to attack //must not be immune to all or immune to attack
Resists res = tar.getResists(); Resists res = tar.getResists();
@@ -693,9 +686,6 @@ public enum CombatManager {
} else { } else {
AbstractCharacter tar = (AbstractCharacter) target; AbstractCharacter tar = (AbstractCharacter) target;
if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){ if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){
if(((PlayerCharacter)tar).combatStats == null){
((PlayerCharacter)tar).combatStats = new PlayerCombatStats((PlayerCharacter)tar);
}
((PlayerCharacter)tar).combatStats.calculateDefense(); ((PlayerCharacter)tar).combatStats.calculateDefense();
defense = ((PlayerCharacter)tar).combatStats.defense; defense = ((PlayerCharacter)tar).combatStats.defense;
}else { }else {
@@ -925,6 +915,7 @@ public enum CombatManager {
damage *= 1 + (armorPierce * 0.01f); damage *= 1 + (armorPierce * 0.01f);
} }
} }
//Resists.handleFortitude(tarAc,damageType,damage); //Resists.handleFortitude(tarAc,damageType,damage);
float d = 0f; float d = 0f;
@@ -978,7 +969,26 @@ public enum CombatManager {
errorTrack = 14; errorTrack = 14;
//handle procs //handle procs
procChanceHandler(weapon,ac,tarAc);
if (weapon != null && tarAc != null && tarAc.isAlive()) {
if(weapon.effects != null){
for (Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
if(mod.modType.equals(ModType.WeaponProc)){
int procChance = ThreadLocalRandom.current().nextInt(100);
if (procChance < MBServerStatics.PROC_CHANCE) {
try {
((WeaponProcEffectModifier) mod).applyProc(ac, target);
}catch(Exception e){
Logger.error(eff.getName() + " Failed To Cast Proc");
}
}
}
}
}
}
}
errorTrack = 15; errorTrack = 15;
@@ -987,16 +997,6 @@ public enum CombatManager {
if (ac.isAlive() && tarAc != null && tarAc.isAlive()) if (ac.isAlive() && tarAc != null && tarAc.isAlive())
handleDamageShields(ac, tarAc, damage); handleDamageShields(ac, tarAc, damage);
//handle mob hate values
if(target.getObjectType().equals(GameObjectType.Mob) && ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
Mob mobTarget = (Mob)target;
if(mobTarget.hate_values.containsKey((PlayerCharacter) ac)){
mobTarget.hate_values.put((PlayerCharacter) ac,mobTarget.hate_values.get((PlayerCharacter) ac) + damage);
}else{
mobTarget.hate_values.put((PlayerCharacter) ac, damage);
}
}
} else { } else {
// Apply Weapon power effect if any. // Apply Weapon power effect if any.
@@ -1062,41 +1062,6 @@ public enum CombatManager {
} }
} }
private static void procChanceHandler(Item weapon, AbstractCharacter ac, AbstractCharacter tarAc) {
//no weapon means no proc
if(weapon == null)
return;
//caster is dead of null, no proc
if(ac == null || !ac.isAlive())
return;
//target is dead or null, no proc
if(tarAc == null || !tarAc.isAlive())
return;
//no effects on weapon, skip proc
if(weapon.effects == null || weapon.effects.isEmpty())
return;
for (Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectModifiers()) {
if (mod.modType.equals(ModType.WeaponProc)) {
int procChance = ThreadLocalRandom.current().nextInt(100);
if (procChance < MBServerStatics.PROC_CHANCE) {
try {
((WeaponProcEffectModifier) mod).applyProc(ac, tarAc);
break;
} catch (Exception e) {
Logger.error(eff.getName() + " Failed To Cast Proc");
}
}
}
}
}
}
public static boolean canTestParry(AbstractCharacter ac, AbstractWorldObject target) { public static boolean canTestParry(AbstractCharacter ac, AbstractWorldObject target) {
if (ac == null || target == null || !AbstractWorldObject.IsAbstractCharacter(target)) if (ac == null || target == null || !AbstractWorldObject.IsAbstractCharacter(target))
@@ -1104,6 +1069,12 @@ public enum CombatManager {
AbstractCharacter tar = (AbstractCharacter) target; AbstractCharacter tar = (AbstractCharacter) target;
if(target.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter pc = (PlayerCharacter) target;
if(pc.getRaceID() == 1999)
return true;
}
CharacterItemManager acItem = ac.getCharItemManager(); CharacterItemManager acItem = ac.getCharItemManager();
CharacterItemManager tarItem = tar.getCharItemManager(); CharacterItemManager tarItem = tar.getCharItemManager();
@@ -1115,12 +1086,6 @@ public enum CombatManager {
Item tarMain = tarItem.getItemFromEquipped(1); Item tarMain = tarItem.getItemFromEquipped(1);
Item tarOff = tarItem.getItemFromEquipped(2); Item tarOff = tarItem.getItemFromEquipped(2);
if(target.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter pc = (PlayerCharacter) target;
if(pc.getRaceID() == 1999 && !isRanged(acMain) && !isRanged(acOff))
return true;
}
return !isRanged(acMain) && !isRanged(acOff) && !isRanged(tarMain) && !isRanged(tarOff); return !isRanged(acMain) && !isRanged(acOff) && !isRanged(tarMain) && !isRanged(tarOff);
} }
@@ -85,7 +85,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new AddBuildingCmd()); DevCmdManager.registerDevCmd(new AddBuildingCmd());
DevCmdManager.registerDevCmd(new AddNPCCmd()); DevCmdManager.registerDevCmd(new AddNPCCmd());
DevCmdManager.registerDevCmd(new AddMobCmd()); DevCmdManager.registerDevCmd(new AddMobCmd());
DevCmdManager.registerDevCmd(new DungenonCmd());
DevCmdManager.registerDevCmd(new RemoveObjectCmd()); DevCmdManager.registerDevCmd(new RemoveObjectCmd());
DevCmdManager.registerDevCmd(new RotateCmd()); DevCmdManager.registerDevCmd(new RotateCmd());
DevCmdManager.registerDevCmd(new FlashMsgCmd()); DevCmdManager.registerDevCmd(new FlashMsgCmd());
+16 -68
View File
@@ -28,7 +28,6 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.*; import engine.net.client.msg.*;
import engine.objects.*; import engine.objects.*;
import engine.powers.*; import engine.powers.*;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.poweractions.AbstractPowerAction; import engine.powers.poweractions.AbstractPowerAction;
import engine.powers.poweractions.TrackPowerAction; import engine.powers.poweractions.TrackPowerAction;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
@@ -175,33 +174,17 @@ public enum PowersManager {
if(pc.isMoving()) if(pc.isMoving())
pc.stopMovement(pc.getMovementLoc()); pc.stopMovement(pc.getMovementLoc());
if(msg.getPowerUsedID() != 421084024 && origin.getPlayerCharacter().getPromotionClassID() != 2513) {
if (!origin.getPlayerCharacter().getPowers().containsKey(msg.getPowerUsedID())) { if(msg.getPowerUsedID() == 429429978){
applyPower(origin.getPlayerCharacter(),origin.getPlayerCharacter(),origin.getPlayerCharacter().getLoc(),429429978,msg.getNumTrains(),false);
origin.getPlayerCharacter().getRecycleTimers().remove(429429978);
return;
}
if(!origin.getPlayerCharacter().getPowers().containsKey(msg.getPowerUsedID())){
Logger.error(origin.getPlayerCharacter().getFirstName() + " attempted to cast a power they do not have"); Logger.error(origin.getPlayerCharacter().getFirstName() + " attempted to cast a power they do not have");
return; return;
} }
}
//crusader sacrifice
if((msg.getPowerUsedID() == 428695403 && msg.getTargetID() == pc.getObjectUUID())){
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message
if (pc != null) {
sendPowerMsg(pc, 2, msg);
if (pc.isCasting()) {
pc.update(false);
}
pc.setIsCasting(false);
}
return;
}
if(msg.getPowerUsedID() == -1851459567){//backstab
applyPower(pc,pc,pc.loc,-1851459567,msg.getNumTrains(),false);
}
if (usePowerA(msg, origin, sendCastToSelf)) { if (usePowerA(msg, origin, sendCastToSelf)) {
// Cast failed for some reason, reset timer // Cast failed for some reason, reset timer
@@ -221,10 +204,6 @@ public enum PowersManager {
} }
} }
if(msg.getPowerUsedID() == 429429978){
origin.getPlayerCharacter().getRecycleTimers().remove(429429978);
}
} }
public static void useMobPower(Mob caster, AbstractCharacter target, PowersBase pb, int rank) { public static void useMobPower(Mob caster, AbstractCharacter target, PowersBase pb, int rank) {
@@ -1181,18 +1160,7 @@ public enum PowersManager {
//DispatchMessage.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); //DispatchMessage.dispatchMsgToInterestArea(playerCharacter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
//handle mob hate values
HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,60.0f,MBServerStatics.MASK_MOB);
for(AbstractWorldObject awo : mobs){
Mob mobTarget = (Mob)awo;
if(mobTarget.hate_values != null) {
if (mobTarget.hate_values.containsKey(playerCharacter)) {
mobTarget.hate_values.put(playerCharacter, mobTarget.hate_values.get(playerCharacter) + pb.getHateValue(trains));
} else {
mobTarget.hate_values.put(playerCharacter, pb.getHateValue(trains));
}
}
}
} }
@@ -1973,7 +1941,9 @@ public enum PowersManager {
} }
} }
public static void runPowerAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, ActionsBase ab, int trains, PowersBase pb) { public static void runPowerAction(AbstractCharacter source,
AbstractWorldObject awo, Vector3fImmutable targetLoc,
ActionsBase ab, int trains, PowersBase pb) {
AbstractPowerAction pa = ab.getPowerAction(); AbstractPowerAction pa = ab.getPowerAction();
if (pa == null) { if (pa == null) {
Logger.error( Logger.error(
@@ -1981,26 +1951,6 @@ public enum PowersManager {
+ ab.getEffectID()); + ab.getEffectID());
return; return;
} }
if(AbstractCharacter.IsAbstractCharacter(awo)) {
try {
boolean immune = false;
AbstractCharacter absChar = (AbstractCharacter) awo;
for (AbstractEffectModifier mod : ab.getPowerAction().getEffectsBase().getModifiers()) {
if (absChar.getBonuses() != null) {
if (absChar.getBonuses().getBool(ModType.ImmuneTo, mod.sourceType) || absChar.getBonuses().getBool(ModType.NoMod, mod.sourceType))
immune = true;
}
}
if (immune)
return;
}catch(Exception e){
}
}
pa.startAction(source, awo, targetLoc, trains, ab, pb); pa.startAction(source, awo, targetLoc, trains, ab, pb);
} }
@@ -2537,12 +2487,10 @@ public enum PowersManager {
return true; return true;
} else if (testPassive(pc, tarAc, "Block")) { } else if (testPassive(pc, tarAc, "Block")) {
// Dodge fired, send dodge message // Dodge fired, send dodge message
//PerformActionMsg dodgeMsg = new PerformActionMsg(msg); PerformActionMsg dodgeMsg = new PerformActionMsg(msg);
//dodgeMsg.setTargetType(awo.getObjectType().ordinal()); dodgeMsg.setTargetType(awo.getObjectType().ordinal());
//dodgeMsg.setTargetID(awo.getObjectUUID()); dodgeMsg.setTargetID(awo.getObjectUUID());
//sendPowerMsg(pc, 4, dodgeMsg); sendPowerMsg(pc, 4, dodgeMsg);
TargetedActionMsg cmm = new TargetedActionMsg(pc, 75, tarAc, MBServerStatics.COMBAT_SEND_BLOCK);
DispatchMessage.sendToAllInRange(tarAc, cmm);
return true; return true;
} }
} }
+3 -3
View File
@@ -21,9 +21,9 @@ public class ZergManager {
return 0.0f; return 0.0f;
switch(count){ switch(count){
case 4: return 0.50f; case 4: return 0.63f;
case 5: return 0.0f; case 5: return 0.40f;
case 6: return 0.0f; case 6: return 0.25f;
default: return 1.0f; default: return 1.0f;
} }
} }
+81 -103
View File
@@ -27,7 +27,6 @@ import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -95,7 +94,7 @@ public class MobAI {
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
} }
} }
@@ -134,9 +133,6 @@ public class MobAI {
if (mob.isMoving() && mob.getRange() > 20) if (mob.isMoving() && mob.getRange() > 20)
return; return;
if(target.combatStats == null)
target.combatStats = new PlayerCombatStats(target);
// add timer for last attack. // add timer for last attack.
ItemBase mainHand = mob.getWeaponItemBase(true); ItemBase mainHand = mob.getWeaponItemBase(true);
@@ -174,7 +170,7 @@ public class MobAI {
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage());
} }
} }
@@ -232,7 +228,7 @@ public class MobAI {
//} //}
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
} }
} }
@@ -271,7 +267,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
} }
} }
@@ -324,7 +320,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
} }
} }
@@ -368,7 +364,7 @@ public class MobAI {
return mob.nextCastTime <= System.currentTimeMillis(); return mob.nextCastTime <= System.currentTimeMillis();
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: canCast" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: canCast" + " " + e.getMessage());
} }
return false; return false;
} }
@@ -454,7 +450,7 @@ public class MobAI {
return true; return true;
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
} }
return false; return false;
} }
@@ -576,7 +572,7 @@ public class MobAI {
return true; return true;
} }
} catch (Exception e) { } catch (Exception e) {
////(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
} }
return false; return false;
} }
@@ -612,7 +608,7 @@ public class MobAI {
mob.nextCallForHelp = System.currentTimeMillis() + 60000; mob.nextCallForHelp = System.currentTimeMillis() + 60000;
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCallForHelp" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCallForHelp" + " " + e.getMessage());
} }
} }
@@ -733,14 +729,12 @@ public class MobAI {
if(mob.isAlive()) if(mob.isAlive())
RecoverHealth(mob); RecoverHealth(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage());
} }
} }
private static void CheckForAggro(Mob aiAgent) { private static void CheckForAggro(Mob aiAgent) {
//old system
try { try {
//looks for and sets mobs combatTarget //looks for and sets mobs combatTarget
@@ -775,11 +769,13 @@ public class MobAI {
continue; continue;
// No aggro for this race type // No aggro for this race type
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == true)
continue; continue;
//mob has enemies and this player race is not it //mob has enemies and this player race is not it
if (aiAgent.enemy.size() > 0 && !aiAgent.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
if (aiAgent.enemy.size() > 0 && aiAgent.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == false)
continue; continue;
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) { if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
@@ -808,7 +804,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
//(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForAggro" + " " + e.getMessage()); Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForAggro" + " " + e.getMessage());
} }
} }
@@ -869,7 +865,7 @@ public class MobAI {
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage());
} }
} }
@@ -923,7 +919,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
//(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn" + " " + e.getMessage()); Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn" + " " + e.getMessage());
} }
} }
@@ -949,7 +945,7 @@ public class MobAI {
AttackTarget(mob, mob.getCombatTarget()); AttackTarget(mob, mob.getCombatTarget());
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForAttack" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForAttack" + " " + e.getMessage());
} }
} }
@@ -976,8 +972,7 @@ public class MobAI {
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
} else { } else {
if(mob.combatTarget == null) CheckForAggro(mob);
NewAggroMechanic(mob);
} }
} }
@@ -1011,7 +1006,7 @@ public class MobAI {
mob.setCombatTarget(null); mob.setCombatTarget(null);
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
} }
} }
@@ -1054,7 +1049,7 @@ public class MobAI {
mob.updateMovementState(); mob.updateMovementState();
mob.updateLocation(); mob.updateLocation();
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget" + " " + e.getMessage());
} }
} }
@@ -1086,7 +1081,7 @@ public class MobAI {
mob.setCombatTarget(aggroMob); mob.setCombatTarget(aggroMob);
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: SafeGuardAggro" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: SafeGuardAggro" + " " + e.getMessage());
} }
} }
@@ -1109,10 +1104,21 @@ public class MobAI {
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
if (newTarget != null) {
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
if (GuardCanAggro(mob, (PlayerCharacter) newTarget))
mob.setCombatTarget(newTarget);
} else
mob.setCombatTarget(newTarget);
}
CheckMobMovement(mob); CheckMobMovement(mob);
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage());
} }
} }
@@ -1134,7 +1140,7 @@ public class MobAI {
CheckMobMovement(mob); CheckMobMovement(mob);
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage());
} }
} }
@@ -1148,7 +1154,7 @@ public class MobAI {
else else
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardWallArcherLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardWallArcherLogic" + " " + e.getMessage());
} }
} }
@@ -1169,7 +1175,7 @@ public class MobAI {
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic" + " " + e.getMessage());
} }
} }
@@ -1185,7 +1191,7 @@ public class MobAI {
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic" + " " + e.getMessage());
} }
} }
@@ -1200,11 +1206,17 @@ public class MobAI {
if (mob.BehaviourType.isAgressive) { if (mob.BehaviourType.isAgressive) {
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
if (newTarget != null)
mob.setCombatTarget(newTarget);
else {
if (mob.getCombatTarget() == null) { if (mob.getCombatTarget() == null) {
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard) if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard)
SafeGuardAggro(mob); //safehold guard SafeGuardAggro(mob); //safehold guard
else else
NewAggroMechanic(mob);//CheckForAggro(mob); //normal aggro CheckForAggro(mob); //normal aggro
}
} }
} }
@@ -1220,7 +1232,7 @@ public class MobAI {
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage());
} }
} }
@@ -1270,7 +1282,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForPlayerGuardAggro" + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForPlayerGuardAggro" + e.getMessage());
} }
} }
@@ -1333,7 +1345,7 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCanAggro" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCanAggro" + " " + e.getMessage());
} }
return false; return false;
} }
@@ -1382,10 +1394,41 @@ public class MobAI {
} }
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints" + " " + e.getMessage());
} }
} }
public static AbstractWorldObject ChangeTargetFromHateValue(Mob mob) {
try {
float CurrentHateValue = 0;
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
CurrentHateValue = ((PlayerCharacter) mob.getCombatTarget()).getHateValue();
AbstractWorldObject mostHatedTarget = null;
for (Entry playerEntry : mob.playerAgroMap.entrySet()) {
PlayerCharacter potentialTarget = PlayerCharacter.getFromCache((int) playerEntry.getKey());
if (potentialTarget.equals(mob.getCombatTarget()))
continue;
if (potentialTarget != null && potentialTarget.getHateValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
CurrentHateValue = potentialTarget.getHateValue();
mostHatedTarget = potentialTarget;
}
}
return mostHatedTarget;
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: ChangeTargetFromMostHated" + " " + e.getMessage());
}
return null;
}
public static void RecoverHealth(Mob mob) { public static void RecoverHealth(Mob mob) {
//recover health //recover health
try { try {
@@ -1403,7 +1446,7 @@ public class MobAI {
mob.setHealth(mob.getHealthMax()); mob.setHealth(mob.getHealthMax());
} }
} catch (Exception e) { } catch (Exception e) {
//(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
} }
} }
@@ -1413,69 +1456,4 @@ public class MobAI {
rwss.setPlayer(mob); rwss.setPlayer(mob);
DispatchMessage.sendToAllInRange(mob, rwss); DispatchMessage.sendToAllInRange(mob, rwss);
} }
public static void NewAggroMechanic(Mob mob){
if(mob == null || !mob.isAlive() || mob.playerAgroMap.isEmpty()){
return;
}
if(mob.BehaviourType.equals(Enum.MobBehaviourType.HamletGuard)){
return;
}
if(mob.hate_values == null)
mob.hate_values = new HashMap<>();
if(mob.combatTarget != null)
return;
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc,60.0f,MBServerStatics.MASK_PLAYER);
if(inRange.isEmpty()){
mob.setCombatTarget(null);
return;
}
//clear out any players who are not in hated range anymore
ArrayList<PlayerCharacter> toRemove = new ArrayList<>();
for(PlayerCharacter pc : mob.hate_values.keySet()){
if(!inRange.contains(pc))
toRemove.add(pc);
}
for(PlayerCharacter pc : toRemove){
mob.hate_values.remove(pc);
}
//find most hated target
PlayerCharacter mostHated = (PlayerCharacter)inRange.iterator().next();
for(AbstractWorldObject awo : inRange){
PlayerCharacter loadedPlayer = (PlayerCharacter)awo;
if (loadedPlayer == null)
continue;
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
if (!loadedPlayer.isAlive())
continue;
//Can't see target, skip aggro.
if (!mob.canSee(loadedPlayer))
continue;
// No aggro for this race type
if (mob.notEnemy != null && mob.notEnemy.size() > 0 && mob.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
continue;
//mob has enemies and this player race is not it
if (mob.enemy != null && mob.enemy.size() > 0 && !mob.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
continue;
if(mob.hate_values.containsKey(loadedPlayer))
if(mob.hate_values.get(loadedPlayer) > mob.hate_values.get(mostHated))
mostHated = loadedPlayer;
}
if(mostHated != null)
mob.setCombatTarget(mostHated);
}
} }
@@ -0,0 +1,33 @@
package engine.mobileAI.MobBehaviours;
import engine.gameManager.ZoneManager;
import engine.mobileAI.utilities.MovementUtilities;
import engine.objects.Mob;
import org.pmw.tinylog.Logger;
public class Pet {
public static void run(Mob pet){
try {
if(StaticBehaviours.EarlyExit(pet))
return;
if (pet.getOwner() == null && pet.isNecroPet() == false && pet.isSiege() == false)
if (ZoneManager.getSeaFloor().zoneMobSet.contains(pet))
pet.killCharacter("no owner");
if(!pet.isSiege())
pet.BehaviourType.canRoam = true;
if (MovementUtilities.canMove(pet) && pet.BehaviourType.canRoam)
StaticBehaviours.CheckMobMovement(pet);
StaticBehaviours.CheckForAttack(pet);
} catch (Exception e) {
Logger.info(pet.getObjectUUID() + " " + pet.getName() + " Failed At: PetLogic" + " " + e.getMessage());
}
}
}
@@ -0,0 +1,146 @@
package engine.mobileAI.MobBehaviours;
import engine.Enum;
import engine.objects.AbstractWorldObject;
import engine.objects.Mob;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;
public class PlayerGuard {
public static void run(Mob guard) {
if(StaticBehaviours.EarlyExit(guard))
return;
if (guard.mobPowers.isEmpty()) {
//mele
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardWallArcher)) {
GuardWallArcherLogic(guard);
} else {
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) {
GuardCaptainLogic(guard);
} else if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
GuardMinionLogic(guard);
}
}
} else {
//caster
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) {
MagisterCaptainLogic(guard);
} else if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
MagisterMinionLogic(guard);
}
}
}
public static void GuardCaptainLogic(Mob mob) {
try {
StaticBehaviours.checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
StaticBehaviours.CheckForPlayerGuardAggro(mob);
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob);
if (newTarget != null) {
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
if (StaticBehaviours.GuardCanAggro(mob, (PlayerCharacter) newTarget))
mob.setCombatTarget(newTarget);
} else
mob.setCombatTarget(newTarget);
}
StaticBehaviours.CheckMobMovement(mob);
StaticBehaviours.CheckForAttack(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage());
}
}
public static void GuardMinionLogic(Mob mob) {
try {
StaticBehaviours.checkToDropGuardAggro(mob);
boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) {
GuardCaptainLogic(mob);
}else {
if (mob.npcOwner.getCombatTarget() != null)
mob.setCombatTarget(mob.npcOwner.getCombatTarget());
else
if (mob.getCombatTarget() != null)
mob.setCombatTarget(null);
}
StaticBehaviours.CheckMobMovement(mob);
StaticBehaviours.CheckForAttack(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage());
}
}
public static void GuardWallArcherLogic(Mob mob) {
try {
StaticBehaviours.checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
StaticBehaviours.CheckForPlayerGuardAggro(mob);
else
StaticBehaviours.CheckForAttack(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardWallArcherLogic" + " " + e.getMessage());
}
}
public static void MagisterCaptainLogic(Mob mob){
try {
StaticBehaviours.checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
StaticBehaviours.CheckForPlayerGuardAggro(mob);
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob);
if (newTarget != null) {
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
if (StaticBehaviours.GuardCanAggro(mob, (PlayerCharacter) newTarget))
mob.setCombatTarget(newTarget);
} else
mob.setCombatTarget(newTarget);
}
StaticBehaviours.CheckMobMovement(mob);
CheckForCast(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage());
}
}
public static void MagisterMinionLogic(Mob mob){
try {
StaticBehaviours.checkToDropGuardAggro(mob);
boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) {
MagisterCaptainLogic(mob);
}else {
if (mob.npcOwner.getCombatTarget() != null)
mob.setCombatTarget(mob.npcOwner.getCombatTarget());
else
if (mob.getCombatTarget() != null)
mob.setCombatTarget(null);
}
StaticBehaviours.CheckMobMovement(mob);
CheckForCast(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage());
}
}
public static void CheckForCast(Mob mob){
}
}
@@ -0,0 +1,27 @@
package engine.mobileAI.MobBehaviours;
import engine.Enum;
import engine.objects.Mob;
public class SiegeEngine {
public static void run(Mob engine){
if(StaticBehaviours.EarlyExit(engine))
return;
if(engine.getOwner() == null)
return;
if(engine.combatTarget == null)
return;
if(engine.combatTarget.loc.distanceSquared(engine.loc) > engine.getRange() * engine.getRange())
return;
if(!engine.combatTarget.getObjectType().equals(Enum.GameObjectType.Building))
return;
StaticBehaviours.CheckForAttack(engine);
}
}
@@ -0,0 +1,53 @@
package engine.mobileAI.MobBehaviours;
import engine.Enum;
import engine.objects.AbstractWorldObject;
import engine.objects.Mob;
import org.pmw.tinylog.Logger;
public class Standard {
public static void run(Mob mob){
try {
if(StaticBehaviours.EarlyExit(mob))
return;
//check for players that can be aggroed if mob is agressive and has no target
if (mob.getCombatTarget() != null && !mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()))
mob.setCombatTarget(null);
if (mob.BehaviourType.isAgressive) {
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob);
if (newTarget != null)
mob.setCombatTarget(newTarget);
else {
if (mob.getCombatTarget() == null) {
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard)
StaticBehaviours.SafeGuardAggro(mob); //safehold guard
else
StaticBehaviours.CheckForAggro(mob); //normal aggro
}
}
}
//check if mob can move for patrol or moving to target
if (mob.BehaviourType.canRoam)
StaticBehaviours.CheckMobMovement(mob);
//check if mob can attack if it isn't wimpy
if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null)
StaticBehaviours.CheckForAttack(mob);
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage());
}
}
}
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -3,6 +3,7 @@ package engine.mobileAI.Threads;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.mobileAI.MobAI; import engine.mobileAI.MobAI;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.mobileAI.MobBehaviours.StaticBehaviours;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.Zone; import engine.objects.Zone;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
@@ -33,7 +34,8 @@ public class MobAIThread implements Runnable{
for (Mob mob : zone.zoneMobSet) { for (Mob mob : zone.zoneMobSet) {
try { try {
if (mob != null) { if (mob != null) {
MobAI.DetermineAction(mob); //MobAI.DetermineAction(mob);
StaticBehaviours.runBehaviour(mob);
} }
} catch (Exception e) { } catch (Exception e) {
Logger.error("Error processing Mob [Name: {}, UUID: {}]", mob.getName(), mob.getObjectUUID(), e); Logger.error("Error processing Mob [Name: {}, UUID: {}]", mob.getName(), mob.getObjectUUID(), e);
@@ -156,8 +156,6 @@ public class CombatUtilities {
switch (target.getObjectType()) { switch (target.getObjectType()) {
case PlayerCharacter: case PlayerCharacter:
PlayerCharacter pc = (PlayerCharacter)target; PlayerCharacter pc = (PlayerCharacter)target;
if(pc.combatStats == null)
pc.combatStats = new PlayerCombatStats(pc);
pc.combatStats.calculateDefense(); pc.combatStats.calculateDefense();
defense = pc.combatStats.defense; defense = pc.combatStats.defense;
break; break;
@@ -66,7 +66,6 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
// Send Guild, Nation and IC MOTD // Send Guild, Nation and IC MOTD
GuildManager.enterWorldMOTD(player); GuildManager.enterWorldMOTD(player);
ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue()); ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue());
ChatManager.sendSystemMessage(player, " Experience Gain: " + ConfigManager.MB_NORMAL_EXP_RATE.getValue());
// Send branch string if available from ConfigManager. // Send branch string if available from ConfigManager.
@@ -54,7 +54,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
return true; return true;
} }
if (!BuildingManager.PlayerCanControlNotOwner(building, pc) && !pc.getAccount().status.equals(Enum.AccountStatus.ADMIN)) if (!BuildingManager.PlayerCanControlNotOwner(building, pc))
return true; return true;
// Can't delete siege assets during an active bane. // Can't delete siege assets during an active bane.
@@ -72,8 +72,8 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
return true; return true;
// Can't destroy a shrine // Can't destroy a shrine
//if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE) if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE)
// return true; return true;
// Cannot destroy mines outside of normal mine mechanics // Cannot destroy mines outside of normal mine mechanics
@@ -282,14 +282,6 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
} }
} }
if(mineTele == null){ if(mineTele == null){
//must be the dungeon request?
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f);
ChatManager.chatSystemInfo(player, "You Will Teleport To Whitehorn Citadel In " + 10 + " Seconds.");
if (10 > 0) {
//TODO add timer to teleport
TeleportJob tj = new TeleportJob(player, npc, loc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, 10 * 1000);
}
return; return;
}else { }else {
int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS; int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
@@ -1027,10 +1027,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
private boolean placeCityWalls(PlayerCharacter player, ClientConnection origin, PlaceAssetMsg msg) { private boolean placeCityWalls(PlayerCharacter player, ClientConnection origin, PlaceAssetMsg msg) {
if(player.getAccount().status.equals(AccountStatus.ADMIN)){
adminCreateBuildings(player,msg);
return false;
}
// Member variables // Member variables
Zone serverZone; Zone serverZone;
@@ -1169,7 +1165,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
return true; return true;
} }
private static Building createStructure(PlayerCharacter playerCharacter, PlacementInfo buildingInfo, Zone currentZone) { private Building createStructure(PlayerCharacter playerCharacter, PlacementInfo buildingInfo, Zone currentZone) {
Blueprint blueprint; Blueprint blueprint;
Building newMesh; Building newMesh;
@@ -1391,16 +1387,4 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
return true; return true;
} }
public static void adminCreateBuildings(PlayerCharacter pc, PlaceAssetMsg msg){
//handled for building dungeon layouts
Zone zone = ZoneManager.getZoneByZoneID(993);
for(PlacementInfo placement : msg.getPlacementInfo()){
Building building = createStructure(pc,placement,zone);
if(building != null) {
building.setProtectionState(ProtectionState.NPC);
building.setRank(1);
}
}
}
} }
@@ -48,7 +48,7 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
PlayerCharacter player = origin.getPlayerCharacter(); PlayerCharacter player = origin.getPlayerCharacter();
WorldGrid.RemoveWorldObject(player);
Dispatch dispatch; Dispatch dispatch;
if (player == null) { if (player == null) {
@@ -57,11 +57,6 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
return true; return true;
} }
//if(player.isEnteredWorld()){
// if(player != null) {
// WorldGrid.RemoveWorldObject(player);
// }
//}
player.setEnteredWorld(false); player.setEnteredWorld(false);
Account acc = SessionManager.getAccount(origin); Account acc = SessionManager.getAccount(origin);
@@ -111,14 +106,9 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
player.getTimestamps().put("EnterWorld", System.currentTimeMillis()); player.getTimestamps().put("EnterWorld", System.currentTimeMillis());
Long logout = player.getTimeStamp("logout"); if (player.getLoc().equals(Vector3fImmutable.ZERO) || System.currentTimeMillis() > player.getTimeStamp("logout") + (15 * 60 * 1000)) {
if (player.getLoc().equals(Vector3fImmutable.ZERO) || System.currentTimeMillis() > logout + (15 * 60 * 1000)) {
player.stopMovement(player.getBindLoc()); player.stopMovement(player.getBindLoc());
try {
player.setSafeMode(); player.setSafeMode();
}catch(Exception e){
Logger.error(e);
}
player.updateLocation(); player.updateLocation();
player.setRegion(AbstractWorldObject.GetRegionByWorldObject(player)); player.setRegion(AbstractWorldObject.GetRegionByWorldObject(player));
} }
@@ -567,12 +567,8 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.put(labelSiege);// 1 sets the protection under siege writer.put(labelSiege);// 1 sets the protection under siege
writer.put(labelCeaseFire); //0 with 1 set above sets to under siege // 1 with 1 set above sets protection status to under siege(cease fire) writer.put(labelCeaseFire); //0 with 1 set above sets to under siege // 1 with 1 set above sets protection status to under siege(cease fire)
writer.put(buttonTransfer); writer.put(buttonTransfer);// 1 enables the transfer asset button
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.SHRINE)) {// 1 enables the transfer asset button
writer.put((byte)1);
}else {
writer.put(buttonDestroy);// 1 enables the destroy asset button writer.put(buttonDestroy);// 1 enables the destroy asset button
}
writer.put(buttonAbandon);// 1 here enables the abandon asset button writer.put(buttonAbandon);// 1 here enables the abandon asset button
writer.put(buttonUpgrade); //disable upgrade building writer.put(buttonUpgrade); //disable upgrade building
@@ -10,7 +10,6 @@
package engine.net.client.msg; package engine.net.client.msg;
import engine.Dungeons.Dungeon;
import engine.net.AbstractConnection; import engine.net.AbstractConnection;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
import engine.net.ByteBufferReader; import engine.net.ByteBufferReader;
@@ -109,7 +108,7 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
writer.putInt(0); writer.putInt(0);
writer.putInt(cities.size() + mines.size());// + 1); writer.putInt(cities.size() + mines.size());
for (City city : cities) for (City city : cities)
City.serializeForClientMsg(city, writer); City.serializeForClientMsg(city, writer);
@@ -117,7 +116,6 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
for(Mine mine : mines) for(Mine mine : mines)
Mine.serializeForClientMsgTeleport(mine, writer); Mine.serializeForClientMsgTeleport(mine, writer);
//Dungeon.serializeForClientMsgTeleport(writer);
} }
public PlayerCharacter getPlayer() { public PlayerCharacter getPlayer() {
@@ -1058,7 +1058,6 @@ public class CharacterItemManager {
i.addToCache(); i.addToCache();
try { try {
i.stripCastableEnchants(); i.stripCastableEnchants();
this.updateInventory();
}catch(Exception ignored){ }catch(Exception ignored){
Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Bank"); Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Bank");
} }
@@ -1204,7 +1203,6 @@ public class CharacterItemManager {
try { try {
i.stripCastableEnchants(); i.stripCastableEnchants();
this.updateInventory();
}catch(Exception ignored){ }catch(Exception ignored){
Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Vault"); Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Vault");
} }
@@ -2450,9 +2448,6 @@ public class CharacterItemManager {
public void damageItem(Item item, int amount) { public void damageItem(Item item, int amount) {
if (item == null || amount < 1 || amount > 5) if (item == null || amount < 1 || amount > 5)
return; return;
if(item.getItemBase().isGlass()){
amount = 1;
}
//verify the item is equipped by this player //verify the item is equipped by this player
int slot = item.getEquipSlot(); int slot = item.getEquipSlot();
+8 -18
View File
@@ -608,62 +608,52 @@ public class Contract extends AbstractGameObject {
case 250019: case 250019:
case 250028: case 250028:
case 250037: case 250037:
me.magicValue = 1000000; me.magicValue = 3000000;
break; break;
case 250002: //10 stats case 250002: //10 stats
case 250011: case 250011:
case 250020: case 250020:
case 250029: case 250029:
case 250038: case 250038:
me.magicValue = 2000000; me.magicValue = 4000000;
break; break;
case 250003: //15 stats case 250003: //15 stats
case 250012: case 250012:
case 250021: case 250021:
case 250030: case 250030:
case 250039: case 250039:
me.magicValue = 3000000; me.magicValue = 5000000;
break; break;
case 250004: //20 stats case 250004: //20 stats
case 250013: case 250013:
case 250022: case 250022:
case 250031: case 250031:
case 250040: case 250040:
me.magicValue = 4000000; me.magicValue = 6000000;
break; break;
case 250005: //25 stats case 250005: //25 stats
case 250014: case 250014:
case 250023: case 250023:
case 250032: case 250032:
case 250041: case 250041:
me.magicValue = 5000000; me.magicValue = 7000000;
break; break;
case 250006: //30 stats case 250006: //30 stats
case 250015: case 250015:
case 250024: case 250024:
case 250033: case 250033:
case 250042: case 250042:
me.magicValue = 6000000; me.magicValue = 8000000;
break; break;
case 250007: //35 stats case 250007: //35 stats
case 250016: case 250016:
case 250025: case 250025:
case 250034: case 250034:
case 250043: case 250043:
me.magicValue = 7000000; me.magicValue = 9000000;
break;
case 250008: //40 stats
case 250017:
case 250026:
case 250035:
case 250044:
me.magicValue = 10000000;
break;
case 252127:
me.magicValue = 5000000;
break; break;
default: default:
me.magicValue = 1000000; me.magicValue = 10000000;
break; break;
} }
} }
+6 -56
View File
@@ -818,65 +818,15 @@ public class Item extends AbstractWorldObject {
} }
public void stripCastableEnchants(){ public void stripCastableEnchants(){
try { ArrayList<Effect> ToRemove = new ArrayList<>();
//strip EnchantWeapon for(Effect eff : this.effects.values()){
if(this.effects.get("EnchantWeapon") != null){ if(eff.getJobContainer() != null && !eff.getJobContainer().noTimer()){
this.effects.remove("EnchantWeapon");
Effect eff = this.effects.get("EnchantWeapon");
eff.endEffectNoPower(); eff.endEffectNoPower();
eff.getJobContainer().cancelJob();
ToRemove.add(eff);
} }
//strip FGM-003
if(this.effects.get("1000") != null){
this.effects.remove("1000");
Effect eff = this.effects.get("1000");
eff.endEffectNoPower();
}
//strip FGM-001
if(this.effects.get("996") != null){
this.effects.remove("996");
Effect eff = this.effects.get("996");
eff.endEffectNoPower();
}
//strip ENC-001
if(this.effects.get("957") != null){
this.effects.remove("957");
Effect eff = this.effects.get("957");
eff.endEffectNoPower();
}
if(this.effects.get("958") != null){
this.effects.remove("958");
Effect eff = this.effects.get("958");
eff.endEffectNoPower();
}
if(this.effects.get("959") != null){
this.effects.remove("959");
Effect eff = this.effects.get("959");
eff.endEffectNoPower();
}
if(this.effects.get("960") != null){
this.effects.remove("960");
Effect eff = this.effects.get("960");
eff.endEffectNoPower();
}
if(this.effects.get("961") != null){
this.effects.remove("961");
Effect eff = this.effects.get("961");
eff.endEffectNoPower();
}
if(this.effects.get("962") != null){
this.effects.remove("962");
Effect eff = this.effects.get("962");
eff.endEffectNoPower();
}
this.applyAllBonuses();
//this.effects.values().removeAll(ToRemove);
}catch(Exception ignored){
} }
this.effects.values().removeAll(ToRemove);
} }
//Only to be used for trading //Only to be used for trading
public void setOwnerID(int ownerID) { public void setOwnerID(int ownerID) {
+8 -10
View File
@@ -259,53 +259,51 @@ public class ItemBase {
case 250019: case 250019:
case 250028: case 250028:
case 250037: case 250037:
return 1000000; return 3000000;
case 250002: //10 stats case 250002: //10 stats
case 250011: case 250011:
case 250020: case 250020:
case 250029: case 250029:
case 250038: case 250038:
return 2000000; return 4000000;
case 250003: //15 stats case 250003: //15 stats
case 250012: case 250012:
case 250021: case 250021:
case 250030: case 250030:
case 250039: case 250039:
return 3000000; return 5000000;
case 250004: //20 stats case 250004: //20 stats
case 250013: case 250013:
case 250022: case 250022:
case 250031: case 250031:
case 250040: case 250040:
return 4000000; return 6000000;
case 250005: //25 stats case 250005: //25 stats
case 250014: case 250014:
case 250023: case 250023:
case 250032: case 250032:
case 250041: case 250041:
return 5000000; return 7000000;
case 250006: //30 stats case 250006: //30 stats
case 250015: case 250015:
case 250024: case 250024:
case 250033: case 250033:
case 250042: case 250042:
return 6000000; return 8000000;
case 250007: //35 stats case 250007: //35 stats
case 250016: case 250016:
case 250025: case 250025:
case 250034: case 250034:
case 250043: case 250043:
return 7000000; return 9000000;
case 250008: //40 stats case 250008: //40 stats
case 250017: case 250017:
case 250026: case 250026:
case 250035: case 250035:
case 250044: case 250044:
return 10000000; return 10000000;
case 252127:
return 5000000;
} }
return 1000000; return 10000000;
} }
/* /*
-4
View File
@@ -710,8 +710,6 @@ public class ItemFactory {
int randomPrefix = TableRoll(vendor.getLevel()); int randomPrefix = TableRoll(vendor.getLevel());
if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather")) if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather"))
randomPrefix += vendor.level * 0.5f; randomPrefix += vendor.level * 0.5f;
if(randomPrefix > 320)
randomPrefix = 320;
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix); prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
if (prefixEntry != null) if (prefixEntry != null)
@@ -729,8 +727,6 @@ public class ItemFactory {
int randomSuffix = TableRoll(vendor.getLevel()); int randomSuffix = TableRoll(vendor.getLevel());
if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather")) if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather"))
randomSuffix += vendor.level * 0.25f; randomSuffix += vendor.level * 0.25f;
if(randomSuffix > 320)
randomSuffix = 320;
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix); suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
if (suffixEntry != null) if (suffixEntry != null)
-3
View File
@@ -111,8 +111,6 @@ public class Mob extends AbstractIntelligenceAgent {
public boolean StrongholdEpic = false; public boolean StrongholdEpic = false;
public boolean isDropper = false; public boolean isDropper = false;
public HashMap<PlayerCharacter,Float> hate_values;
/** /**
* No Id Constructor * No Id Constructor
@@ -1452,7 +1450,6 @@ public class Mob extends AbstractIntelligenceAgent {
this.stopPatrolTime = 0; this.stopPatrolTime = 0;
this.lastPatrolPointIndex = 0; this.lastPatrolPointIndex = 0;
InterestManager.setObjectDirty(this); InterestManager.setObjectDirty(this);
this.hate_values = new HashMap<>();
} }
public void despawn() { public void despawn() {
+1 -13
View File
@@ -41,7 +41,6 @@ import engine.server.MBServerStatics;
import engine.server.login.LoginServer; import engine.server.login.LoginServer;
import engine.server.login.LoginServerMsgHandler; import engine.server.login.LoginServerMsgHandler;
import engine.server.world.WorldServer; import engine.server.world.WorldServer;
import engine.util.KeyCloneAudit;
import engine.util.MiscUtils; import engine.util.MiscUtils;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -2958,7 +2957,6 @@ public class PlayerCharacter extends AbstractCharacter {
} }
public synchronized void grantXP(int xp) { public synchronized void grantXP(int xp) {
xp *= LootManager.NORMAL_EXP_RATE;
int groupSize = 1; int groupSize = 1;
if(GroupManager.getGroup(this)!= null) if(GroupManager.getGroup(this)!= null)
groupSize = GroupManager.getGroup(this).members.size(); groupSize = GroupManager.getGroup(this).members.size();
@@ -5145,9 +5143,7 @@ public class PlayerCharacter extends AbstractCharacter {
@Override @Override
public void update(Boolean newSystem) { public void update(Boolean newSystem) {
if(!newSystem)
this.updateLocation(); this.updateLocation();
this.updateMovementState(); this.updateMovementState();
if(!newSystem) if(!newSystem)
@@ -5163,11 +5159,7 @@ public class PlayerCharacter extends AbstractCharacter {
if (this.combatStats == null) { if (this.combatStats == null) {
this.combatStats = new PlayerCombatStats(this); this.combatStats = new PlayerCombatStats(this);
} else { } else {
try {
this.combatStats.update(); this.combatStats.update();
}catch(Exception ignored){
}
} }
this.doRegen(); this.doRegen();
} }
@@ -5182,8 +5174,6 @@ public class PlayerCharacter extends AbstractCharacter {
this.updateBlessingMessage(); this.updateBlessingMessage();
this.safeZone = this.isInSafeZone(); this.safeZone = this.isInSafeZone();
if(this.isActive && this.enteredWorld) {
if (!this.timestamps.containsKey("nextBoxCheck")) if (!this.timestamps.containsKey("nextBoxCheck"))
this.timestamps.put("nextBoxCheck", System.currentTimeMillis() + 10000); this.timestamps.put("nextBoxCheck", System.currentTimeMillis() + 10000);
@@ -5201,7 +5191,7 @@ public class PlayerCharacter extends AbstractCharacter {
if (this.isBoxed && !this.containsEffect(1672601862)) { if (this.isBoxed && !this.containsEffect(1672601862)) {
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false); PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
} }
}
if (this.isFlying()) { if (this.isFlying()) {
if (this.effects.containsKey("MoveBuff")) { if (this.effects.containsKey("MoveBuff")) {
GroundPlayer(this); GroundPlayer(this);
@@ -5670,8 +5660,6 @@ public class PlayerCharacter extends AbstractCharacter {
} }
public void setEnteredWorld(boolean enteredWorld) { public void setEnteredWorld(boolean enteredWorld) {
if(enteredWorld)
this.timestamps.put("nextBoxCheck", System.currentTimeMillis() + 10000);
this.enteredWorld = enteredWorld; this.enteredWorld = enteredWorld;
} }
+15 -63
View File
@@ -1,7 +1,6 @@
package engine.objects; package engine.objects;
import engine.Enum; import engine.Enum;
import engine.jobs.DeferredPowerJob;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import engine.powers.PowersBase; import engine.powers.PowersBase;
import engine.powers.effectmodifiers.AbstractEffectModifier; import engine.powers.effectmodifiers.AbstractEffectModifier;
@@ -359,22 +358,13 @@ public class PlayerCombatStats {
float stanceValue = 0.0f; float stanceValue = 0.0f;
float atrEnchants = 0; float atrEnchants = 0;
float healerDefStance = 0.0f;
for(String effID : this.owner.effects.keySet()) { for(String effID : this.owner.effects.keySet()) {
if (effID.contains("Stance")) { if (effID.contains("Stance")) {
Effect effect = this.owner.effects.get(effID); Effect effect = this.owner.effects.get(effID);
EffectsBase eb = effect.getEffectsBase(); EffectsBase eb = effect.getEffectsBase();
if(eb.getIDString().equals("STC-H-DA")){ if(eb.getIDString().equals("STC-H-DA"))
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());
healerDefStance += modValue * 0.01f;
}
}
continue; continue;
}
for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) { for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.OCV)) { if (mod.modType.equals(Enum.ModType.OCV)) {
float percent = mod.getPercentMod(); float percent = mod.getPercentMod();
@@ -434,7 +424,7 @@ public class PlayerCombatStats {
atr *= 1.0f + stanceValue; atr *= 1.0f + stanceValue;
if(this.owner.bonuses != null) { if(this.owner.bonuses != null) {
float positivePercentBonuses = this.owner.bonuses.getFloatPercentPositive(Enum.ModType.OCV, Enum.SourceType.None) - stanceValue; float positivePercentBonuses = this.owner.bonuses.getFloatPercentPositive(Enum.ModType.OCV, Enum.SourceType.None);
float negativePercentBonuses = this.owner.bonuses.getFloatPercentNegative(Enum.ModType.OCV, Enum.SourceType.None); float negativePercentBonuses = this.owner.bonuses.getFloatPercentNegative(Enum.ModType.OCV, Enum.SourceType.None);
float modifier = 1 + (positivePercentBonuses + negativePercentBonuses); float modifier = 1 + (positivePercentBonuses + negativePercentBonuses);
if(preciseRune > 1.0f) if(preciseRune > 1.0f)
@@ -442,7 +432,6 @@ public class PlayerCombatStats {
if(stanceValue > 0.0f){ if(stanceValue > 0.0f){
modifier -= (stanceValue); modifier -= (stanceValue);
} }
modifier -= healerDefStance;
atr *= modifier; atr *= modifier;
} }
atr = (float) Math.round(atr); atr = (float) Math.round(atr);
@@ -517,7 +506,6 @@ public class PlayerCombatStats {
); );
if(this.owner.bonuses != null){ if(this.owner.bonuses != null){
minDMG += this.owner.bonuses.getFloat(Enum.ModType.MinDamage, Enum.SourceType.None); minDMG += this.owner.bonuses.getFloat(Enum.ModType.MinDamage, Enum.SourceType.None);
minDMG += this.owner.bonuses.getFloat(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None);
minDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None); minDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None);
} }
@@ -598,7 +586,6 @@ public class PlayerCombatStats {
if(this.owner.bonuses != null){ if(this.owner.bonuses != null){
maxDMG += this.owner.bonuses.getFloat(Enum.ModType.MaxDamage, Enum.SourceType.None); maxDMG += this.owner.bonuses.getFloat(Enum.ModType.MaxDamage, Enum.SourceType.None);
maxDMG += this.owner.bonuses.getFloat(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None);
maxDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None); maxDMG *= 1 + this.owner.bonuses.getFloatPercentAll(Enum.ModType.MeleeDamageModifier, Enum.SourceType.None);
} }
@@ -779,21 +766,17 @@ public class PlayerCombatStats {
blockSkill = this.owner.skills.get("Block").getModifiedAmount(); blockSkill = this.owner.skills.get("Block").getModifiedAmount();
float shieldDefense = 0.0f; float shieldDefense = 0.0f;
try { if(this.owner.charItemManager.getEquipped(2) != null && this.owner.charItemManager.getEquipped(2).getItemBase().isShield()){
if (this.owner.charItemManager.getEquipped(2) != null && this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) {
Item shield = this.owner.charItemManager.getEquipped(2); Item shield = this.owner.charItemManager.getEquipped(2);
shieldDefense += shield.getItemBase().getDefense(); shieldDefense += shield.getItemBase().getDefense();
for (Effect eff : shield.effects.values()) { for(Effect eff : shield.effects.values()){
for (AbstractEffectModifier mod : eff.getEffectModifiers()) { for(AbstractEffectModifier mod : eff.getEffectModifiers()){
if (mod.modType.equals(Enum.ModType.DR)) { if(mod.modType.equals(Enum.ModType.DR)){
shieldDefense += mod.minMod + (mod.getRamp() * eff.getTrains()); shieldDefense += mod.minMod + (mod.getRamp() * eff.getTrains());
} }
} }
} }
} }
}catch(Exception ignore){
}
float weaponSkill = 0.0f; float weaponSkill = 0.0f;
float masterySkill = 0.0f; float masterySkill = 0.0f;
@@ -855,10 +838,9 @@ public class PlayerCombatStats {
//right ring //right ring
if(this.owner.charItemManager != null){ if(this.owner.charItemManager != null){
try{
if(this.owner.charItemManager.getEquipped(7) != null){ if(this.owner.charItemManager.getEquipped(7) != null){
for(String effID : this.owner.charItemManager.getEquipped(7).effects.keySet()) { for(String effID : this.owner.charItemManager.getEquipped(7).effects.keySet()) {
for (AbstractEffectModifier mod : this.owner.charItemManager.getEquipped(7).effects.get(effID).getEffectModifiers()) { for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.DCV)) { if (mod.modType.equals(Enum.ModType.DCV)) {
if (mod.getPercentMod() == 0) { if (mod.getPercentMod() == 0) {
float value = mod.getMinMod(); float value = mod.getMinMod();
@@ -870,14 +852,11 @@ public class PlayerCombatStats {
} }
} }
} }
}catch(Exception e){
}
//left ring //left ring
try { if(this.owner.charItemManager.getEquipped(8) != null){
if (this.owner.charItemManager.getEquipped(8) != null) { for(String effID : this.owner.charItemManager.getEquipped(8).effects.keySet()) {
for (String effID : this.owner.charItemManager.getEquipped(8).effects.keySet()) { for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) {
for (AbstractEffectModifier mod : this.owner.charItemManager.getEquipped(8).effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.DCV)) { if (mod.modType.equals(Enum.ModType.DCV)) {
if (mod.getPercentMod() == 0) { if (mod.getPercentMod() == 0) {
float value = mod.getMinMod(); float value = mod.getMinMod();
@@ -889,14 +868,11 @@ public class PlayerCombatStats {
} }
} }
} }
}catch(Exception e){
}
//necklace //necklace
try{
if(this.owner.charItemManager.getEquipped(9) != null){ if(this.owner.charItemManager.getEquipped(9) != null){
for(String effID : this.owner.charItemManager.getEquipped(9).effects.keySet()) { for(String effID : this.owner.charItemManager.getEquipped(9).effects.keySet()) {
for (AbstractEffectModifier mod : this.owner.charItemManager.getEquipped(9).effects.get(effID).getEffectModifiers()) { for (AbstractEffectModifier mod : this.owner.effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.DCV)) { if (mod.modType.equals(Enum.ModType.DCV)) {
if (mod.getPercentMod() == 0) { if (mod.getPercentMod() == 0) {
float value = mod.getMinMod(); float value = mod.getMinMod();
@@ -908,20 +884,12 @@ public class PlayerCombatStats {
} }
} }
} }
}catch(Exception e){
} }
try{
if(this.owner.charItemManager.getEquipped(2) == null) if(this.owner.charItemManager.getEquipped(2) == null)
blockSkill = 0; blockSkill = 0;
else if(this.owner.charItemManager != null && this.owner.charItemManager.getEquipped(2) != null && !this.owner.charItemManager.getEquipped(2).getItemBase().isShield()) else if(this.owner.charItemManager != null && this.owner.charItemManager.getEquipped(2) != null && !this.owner.charItemManager.getEquipped(2).getItemBase().isShield())
blockSkill = 0; blockSkill = 0;
}catch(Exception e){
}
}
float defense = (1 + armorSkill / 50) * armorDefense; float defense = (1 + armorSkill / 50) * armorDefense;
defense += (1 + blockSkill / 100) * shieldDefense; defense += (1 + blockSkill / 100) * shieldDefense;
@@ -1014,22 +982,12 @@ public class PlayerCombatStats {
float stanceMod = 1.0f; float stanceMod = 1.0f;
float atrBuffs = 0.0f; float atrBuffs = 0.0f;
float healerDefStance = 0.0f;
for(String effID : pc.effects.keySet()) { for(String effID : pc.effects.keySet()) {
if (effID.contains("Stance")) { if (effID.contains("Stance")) {
Effect effect = pc.effects.get(effID); Effect effect = pc.effects.get(effID);
EffectsBase eb = effect.getEffectsBase(); EffectsBase eb = effect.getEffectsBase();
if(eb.getIDString().equals("STC-H-DA")){ if(eb.getIDString().equals("STC-H-DA"))
for (AbstractEffectModifier mod : pc.effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.OCV)) {
float percent = mod.getPercentMod();
int trains = pc.effects.get(effID).getTrains();
float modValue = percent + (trains * mod.getRamp());
healerDefStance += modValue * 0.01f;
}
}
continue; continue;
}
for (AbstractEffectModifier mod : pc.effects.get(effID).getEffectModifiers()) { for (AbstractEffectModifier mod : pc.effects.get(effID).getEffectModifiers()) {
if (mod.modType.equals(Enum.ModType.OCV)) { if (mod.modType.equals(Enum.ModType.OCV)) {
float percent = mod.getPercentMod(); float percent = mod.getPercentMod();
@@ -1056,14 +1014,8 @@ public class PlayerCombatStats {
atr += (modifiedDexterity * 0.5f) + weaponATR1 + weaponATR2; atr += (modifiedDexterity * 0.5f) + weaponATR1 + weaponATR2;
atr *= precise; atr *= precise;
atr += atrBuffs; atr += atrBuffs;
if(pc.getWeaponPower() != null){
DeferredPowerJob dpj = pc.getWeaponPower();
dpj.endEffect();
}
if(pc.bonuses != null) if(pc.bonuses != null)
atr *= 1 + (pc.bonuses.getFloatPercentAll(Enum.ModType.OCV, Enum.SourceType.None) - (stanceMod - 1) - (precise - 1) - healerDefStance); atr *= 1 + (pc.bonuses.getFloatPercentAll(Enum.ModType.OCV, Enum.SourceType.None) - (stanceMod - 1) - (precise - 1));
atr *= stanceMod; atr *= stanceMod;
return atr; return atr;
} }
@@ -176,8 +176,7 @@ public class HealthEffectModifier extends AbstractEffectModifier {
} }
if(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){ if(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
float multiplier = ((PlayerCharacter)source).ZergMultiplier; modAmount *= ((PlayerCharacter)source).ZergMultiplier;
modAmount *= multiplier;
} }
if (modAmount == 0f) if (modAmount == 0f)
-3
View File
@@ -281,9 +281,6 @@ public class LoginServer {
Logger.info("Loading All Realms"); Logger.info("Loading All Realms");
Realm.loadAllRealms(); Realm.loadAllRealms();
Logger.info("Trashing Multibox Cheaters");
DbManager.AccountQueries.TRASH_CHEATERS();
Logger.info("***Boot Successful***"); Logger.info("***Boot Successful***");
return true; return true;
} }
@@ -97,27 +97,5 @@ public class HourlyJobThread implements Runnable {
bane.setDefaultTime(); bane.setDefaultTime();
} }
} }
try{
Logger.info("Trashing Multibox Cheaters");
DbManager.AccountQueries.TRASH_CHEATERS();
//disconnect all players who were banned and are still in game
for(PlayerCharacter pc : SessionManager.getAllActivePlayers()){
Account account = pc.getClientConnection().getAccount();
if(account == null)
continue;
try {
boolean banned = DbManager.AccountQueries.GET_ACCOUNT(account.getUname()).status.equals(Enum.AccountStatus.BANNED);
if (banned) {
pc.getClientConnection().forceDisconnect();
}
}catch(Exception e){
Logger.error(e.getMessage());
}
}
}catch(Exception e){
Logger.error("Failed To Run Ban Multibox Abusers");
}
} }
} }