From 47bc9d4e9a3e73ea0f23979b9e2037bd3c7b0b32 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Wed, 19 Oct 2016 10:18:57 +0200 Subject: [PATCH] Being incapacitated while having the weakened debuff now results in instant death --- src/services/combat/CombatManager.java | 44 ++++++++++++++------------ src/services/combat/CorpseService.java | 5 ++- src/services/commands/BuffService.java | 13 +++++--- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/services/combat/CombatManager.java b/src/services/combat/CombatManager.java index fe23ca49..416875d0 100644 --- a/src/services/combat/CombatManager.java +++ b/src/services/combat/CombatManager.java @@ -72,6 +72,8 @@ import utilities.ThreadUtilities; public class CombatManager extends Manager { + private static final byte INCAP_TIMER = 10; // Amount of seconds to be incapacitated + private final Map inCombat; private final Set regeneratingHealthCreatures; // Only allowed outside of combat private final Set regeneratingActionCreatures; // Always allowed @@ -318,9 +320,9 @@ public class CombatManager extends Manager { } } - private void doCreatureDeath(CreatureObject killedCreature, CreatureObject killer) { - killedCreature.setHealth(0); - killer.removeDefender(killedCreature); + private void doCreatureDeath(CreatureObject corpse, CreatureObject killer) { + corpse.setHealth(0); + killer.removeDefender(corpse); // Let's check if the killer needs to remain in-combat... if(!killer.hasDefenders()) { @@ -329,37 +331,39 @@ public class CombatManager extends Manager { } // The creature should not be able to move or turn. - killedCreature.setTurnScale(0); - killedCreature.setMovementScale(0); + corpse.setTurnScale(0); + corpse.setMovementScale(0); // We need to handle this differently, depending on whether killedCreature is a player or not - if(killedCreature.isPlayer()) { - // TODO account for AI deathblowing players..? - // If it's a player, they need to be incapacitated - incapacitatePlayer(killer, killedCreature); + if(corpse.isPlayer()) { + if (corpse.getBuffByCrc(new CRC("incapweaken")) != null) { + // Kill this sucka immediately + killCreature(killer, corpse); + } else { + incapacitatePlayer(killer, corpse); + } } else { // This is just a plain ol' NPC. Die! - killCreature(killer, killedCreature); + killCreature(killer, corpse); } - exitCombat(killedCreature); + exitCombat(corpse); } - private void incapacitatePlayer(CreatureObject incapacitator, CreatureObject incapacitatedPlayer) { - int incapacitationCounter = 10; - incapacitatedPlayer.setPosture(Posture.INCAPACITATED); - incapacitatedPlayer.setCounter(incapacitationCounter); + private void incapacitatePlayer(CreatureObject incapacitator, CreatureObject incapacitated) { + incapacitated.setPosture(Posture.INCAPACITATED); + incapacitated.setCounter(INCAP_TIMER); - Log.i(this, "%s was incapacitated", incapacitatedPlayer); + Log.i(this, "%s was incapacitated", incapacitated); // Once the incapacitation counter expires, revive them. synchronized(incapacitatedCreatures) { - incapacitatedCreatures.put(incapacitatedPlayer, executor.schedule(() -> expireIncapacitation(incapacitatedPlayer), incapacitationCounter, TimeUnit.SECONDS)); + incapacitatedCreatures.put(incapacitated, executor.schedule(() -> expireIncapacitation(incapacitated), INCAP_TIMER, TimeUnit.SECONDS)); } - new BuffIntent("incapWeaken", incapacitator, incapacitatedPlayer, false).broadcast(); - new ChatBroadcastIntent(incapacitator.getOwner(), new ProsePackage(new StringId("base_player", "prose_target_incap"), "TT", incapacitatedPlayer.getName())).broadcast(); - new ChatBroadcastIntent(incapacitatedPlayer.getOwner(), new ProsePackage(new StringId("base_player", "prose_victim_incap"), "TT", incapacitator.getName())).broadcast(); + new BuffIntent("incapWeaken", incapacitator, incapacitated, false).broadcast(); + new ChatBroadcastIntent(incapacitator.getOwner(), new ProsePackage(new StringId("base_player", "prose_target_incap"), "TT", incapacitated.getName())).broadcast(); + new ChatBroadcastIntent(incapacitated.getOwner(), new ProsePackage(new StringId("base_player", "prose_victim_incap"), "TT", incapacitator.getName())).broadcast(); } private void expireIncapacitation(CreatureObject incapacitatedPlayer) { diff --git a/src/services/combat/CorpseService.java b/src/services/combat/CorpseService.java index c7660dc2..95d81af3 100644 --- a/src/services/combat/CorpseService.java +++ b/src/services/combat/CorpseService.java @@ -368,7 +368,10 @@ public final class CorpseService extends Service { corpse.setTurnScale(1); corpse.setMovementScale(1); corpse.setHealth(corpse.getMaxHealth()); - new BuffIntent("incapWeaken", corpse, corpse, true).broadcastAfterIntent(new BuffIntent("cloning_sickness", corpse, corpse, false)); + + BuffIntent cloningSickness = new BuffIntent("cloning_sickness", corpse, corpse, false); + new BuffIntent("incapweaken", corpse, corpse, true).broadcastAfterIntent(cloningSickness); + cloningSickness.broadcast(); } /** diff --git a/src/services/commands/BuffService.java b/src/services/commands/BuffService.java index d2ab38af..37b0e066 100644 --- a/src/services/commands/BuffService.java +++ b/src/services/commands/BuffService.java @@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit; import intents.BuffIntent; import intents.PlayerEventIntent; import intents.SkillModIntent; +import java.util.Locale; import java.util.concurrent.ScheduledExecutorService; import network.packets.swg.zone.PlayClientEffectObjectMessage; import resources.client_info.ClientFactory; @@ -58,7 +59,7 @@ public class BuffService extends Service { private final ScheduledExecutorService executor; private final Map> buffRemoval; - private final Map dataMap; + private final Map dataMap; // All CRCs are lower-cased buff names! public BuffService() { registerForIntent(BuffIntent.TYPE); @@ -113,7 +114,7 @@ public class BuffService extends Service { DatatableData buffTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/buff/buff.iff"); for(int row = 0; row < buffTable.getRowCount(); row++) { - dataMap.put(new CRC((String) buffTable.getCell(row, 0)), new BuffData( + dataMap.put(new CRC(((String) buffTable.getCell(row, 0)).toLowerCase(Locale.ENGLISH)), new BuffData( (int) buffTable.getCell(row, 28), // max stacks (String) buffTable.getCell(row, 7), // effect1 (float) buffTable.getCell(row, 8), // value1 @@ -134,10 +135,12 @@ public class BuffService extends Service { } private void handleBuffIntent(BuffIntent i) { + CRC buffCrc = new CRC(i.getBuffName().toLowerCase(Locale.ENGLISH)); + if (i.isRemove()) { - removeBuff(i.getReceiver(), new CRC(i.getBuffName()), false); + removeBuff(i.getReceiver(), buffCrc, false); } else { - addBuff(new CRC(i.getBuffName()), i.getReceiver(), i.getBuffer()); + addBuff(buffCrc, i.getReceiver(), i.getBuffer()); } } @@ -164,7 +167,7 @@ public class BuffService extends Service { BuffData buffData = dataMap.get(buffCrc); if(buffData == null) { - Log.e(this, "Could not add %s to %s - buff data for it does not exist", receiver, buffCrc); + Log.e(this, "Could not add %s to %s - buff data for it does not exist", buffCrc, receiver); return; }