Compare commits
7 Commits
combat-2
...
74bd7ddb8b
| Author | SHA1 | Date | |
|---|---|---|---|
| 74bd7ddb8b | |||
| 4feb95131c | |||
| d22ba7b89d | |||
| 722fd14be5 | |||
| 12e73d59c7 | |||
| 5c70f15064 | |||
| 8ca641f353 |
@@ -124,7 +124,7 @@ public enum CombatManager {
|
||||
return;
|
||||
|
||||
//check if this slot is on attack timer, if timer has passed clear it, else early exit
|
||||
if(attacker.getTimers().containsKey("Attack"+slot.name()))
|
||||
if(attacker.getTimers() != null && attacker.getTimers().containsKey("Attack"+slot.name()))
|
||||
if(attacker.getTimers().get("Attack"+slot.name()).timeToExecutionLeft() <= 0)
|
||||
attacker.getTimers().remove("Attack"+slot.name());
|
||||
else
|
||||
@@ -264,6 +264,22 @@ public enum CombatManager {
|
||||
atr = attacker.atrHandTwo;
|
||||
}
|
||||
|
||||
//apply weapon powers before early exit for miss or passives
|
||||
DeferredPowerJob dpj = null;
|
||||
|
||||
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
|
||||
|
||||
dpj = ((PlayerCharacter) attacker).getWeaponPower();
|
||||
|
||||
if (dpj != null) {
|
||||
dpj.attack(target, attackRange);
|
||||
|
||||
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
|
||||
((PlayerCharacter) attacker).setWeaponPower(dpj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int def = 0;
|
||||
|
||||
if (AbstractCharacter.IsAbstractCharacter(target))
|
||||
@@ -332,6 +348,9 @@ public enum CombatManager {
|
||||
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
|
||||
DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
|
||||
//we need to send the animation even if the attacker misses
|
||||
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template,null,slot));
|
||||
DispatchManager.sendToAllInRange(target, cmm);
|
||||
//set auto attack job
|
||||
setAutoAttackJob(attacker, slot, delay);
|
||||
return;
|
||||
@@ -414,6 +433,9 @@ public enum CombatManager {
|
||||
|
||||
if (resists.immuneTo(damageType)) {
|
||||
//set auto attack job
|
||||
//we need to send the animation even if the attacker misses
|
||||
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template,null,slot));
|
||||
DispatchManager.sendToAllInRange(target, cmm);
|
||||
setAutoAttackJob(attacker, slot, delay);
|
||||
return;
|
||||
}
|
||||
@@ -446,20 +468,6 @@ public enum CombatManager {
|
||||
}
|
||||
}
|
||||
|
||||
DeferredPowerJob dpj = null;
|
||||
|
||||
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
|
||||
|
||||
dpj = ((PlayerCharacter) attacker).getWeaponPower();
|
||||
|
||||
if (dpj != null) {
|
||||
dpj.attack(target, attackRange);
|
||||
|
||||
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
|
||||
((PlayerCharacter) attacker).setWeaponPower(dpj);
|
||||
}
|
||||
}
|
||||
|
||||
//set auto attack job
|
||||
setAutoAttackJob(attacker, slot, delay);
|
||||
|
||||
@@ -537,7 +545,7 @@ public enum CombatManager {
|
||||
}
|
||||
|
||||
//Item has no equipment slots and should not try to return an animation, return default instead
|
||||
if(wb.item_eq_slots_or == null || wb.item_eq_slots_or.size() == 0){
|
||||
if(wb.item_eq_slots_or == null || wb.item_eq_slots_or.isEmpty()){
|
||||
return 75;
|
||||
}
|
||||
|
||||
|
||||
@@ -393,6 +393,12 @@ public enum ForgeManager implements Runnable {
|
||||
if (rollForModifier < 80) {
|
||||
int randomModifier = LootManager.TableRoll(vendor.getLevel(), false);
|
||||
modTableEntry = ModTableEntry.rollTable(modTypeTableEntry.modTableID, randomModifier);
|
||||
|
||||
// @TODO : Figure out how a null can be returned from a defined set.
|
||||
|
||||
if (modTableEntry == null)
|
||||
return 0;
|
||||
|
||||
EffectsBase effectsBase = PowersManager.getEffectByIDString(modTableEntry.action);
|
||||
modifier = effectsBase.getToken();
|
||||
}
|
||||
|
||||
@@ -175,6 +175,8 @@ public class MobAI {
|
||||
public static void attackMob(Mob mob, Mob target) {
|
||||
|
||||
try {
|
||||
if(mob == null || target == null)
|
||||
return;
|
||||
|
||||
if (mob.getRange() >= 30 && mob.isMoving())
|
||||
return;
|
||||
|
||||
@@ -31,6 +31,7 @@ import engine.net.client.msg.ApplyRuneMsg;
|
||||
import engine.net.client.msg.UpdateStateMsg;
|
||||
import engine.powers.EffectsBase;
|
||||
import engine.powers.PowersBase;
|
||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -804,7 +805,25 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
if (weapon != null)
|
||||
speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.WeaponSpeed, SourceType.None));
|
||||
|
||||
speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
PlayerBonuses bonuses = abstractCharacter.bonuses;
|
||||
if(bonuses != null){
|
||||
ModType modType = ModType.AttackDelay;
|
||||
for (AbstractEffectModifier mod : bonuses.bonusFloats.keySet()) {
|
||||
|
||||
if (mod.getPercentMod() == 0)
|
||||
continue;
|
||||
|
||||
|
||||
if (!mod.modType.equals(modType))
|
||||
continue;
|
||||
|
||||
if (bonuses.bonusFloats.get(mod) == null)
|
||||
continue;
|
||||
|
||||
speed *= (1 + bonuses.bonusFloats.get(mod));
|
||||
}
|
||||
}
|
||||
//speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
|
||||
if (speed < 10)
|
||||
speed = 10;
|
||||
@@ -1809,7 +1828,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
//handle hate value addition
|
||||
Mob target = (Mob) this;
|
||||
if (attacker.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
target.playerAgroMap.put(attacker.getObjectUUID(), target.playerAgroMap.get(attacker.getObjectUUID()) + value);
|
||||
|
||||
if(target.playerAgroMap.containsKey(attacker.getObjectUUID()))
|
||||
target.playerAgroMap.put(attacker.getObjectUUID(), target.playerAgroMap.get(attacker.getObjectUUID()) + value);
|
||||
else
|
||||
target.playerAgroMap.put(attacker.getObjectUUID(), value);
|
||||
|
||||
|
||||
if (target.isPlayerGuard()) {
|
||||
if (target.guardedCity != null && target.guardedCity.cityOutlaws.contains(attacker.getObjectUUID()) == false)
|
||||
target.guardedCity.cityOutlaws.add(attacker.getObjectUUID());
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
public class PlayerBonuses {
|
||||
|
||||
//First bonus set
|
||||
private ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>();
|
||||
ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<AbstractEffectModifier, DamageShield> bonusDamageShields = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<AbstractEffectModifier, String> bonusStrings = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<ModType, HashSet<SourceType>> bonusLists = new ConcurrentHashMap<>();
|
||||
|
||||
Reference in New Issue
Block a user