Kaynağa Gözat

BETA: Core part for [DP9810].
Patch by: Adry_85, Zoey76

Adry_85 12 yıl önce
ebeveyn
işleme
d08b4f90a1

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -1643,7 +1643,6 @@ public class L2CharacterAI extends AbstractAI
 			{
 				return true;
 			}
-			
 		}
 		return false;
 	}

+ 12 - 26
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -25,8 +25,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 
-import javolution.util.FastMap;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ItemsAutoDestroy;
 import com.l2jserver.gameserver.SevenSigns;
@@ -79,7 +77,7 @@ public class L2Attackable extends L2Npc
 	private boolean _isRaid = false;
 	private boolean _isRaidMinion = false;
 	private boolean _champion = false;
-	private final Map<L2Character, AggroInfo> _aggroList = new FastMap<L2Character, AggroInfo>().shared();
+	private final Map<L2Character, AggroInfo> _aggroList = new ConcurrentHashMap<>();
 	private boolean _isReturningToSpawnPoint = false;
 	private boolean _canReturnToSpawnPoint = true;
 	private boolean _seeThroughSilentMove = false;
@@ -948,10 +946,9 @@ public class L2Attackable extends L2Npc
 			return;
 		}
 		
-		L2PcInstance targetPlayer = attacker.getActingPlayer();
+		final L2PcInstance targetPlayer = attacker.getActingPlayer();
 		// Get the AggroInfo of the attacker L2Character from the _aggroList of the L2Attackable
 		AggroInfo ai = getAggroList().get(attacker);
-		
 		if (ai == null)
 		{
 			ai = new AggroInfo(attacker);
@@ -983,7 +980,7 @@ public class L2Attackable extends L2Npc
 		}
 		
 		// Set the intention to the L2Attackable to AI_INTENTION_ACTIVE
-		if ((aggro > 0) && (getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE))
+		if ((aggro != 0) && (getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE))
 		{
 			getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
 		}
@@ -1003,7 +1000,6 @@ public class L2Attackable extends L2Npc
 		if (target == null) // whole aggrolist
 		{
 			L2Character mostHated = getMostHated();
-			
 			if (mostHated == null) // makes target passive for a moment more
 			{
 				((L2AttackableAI) getAI()).setGlobalAggro(-25);
@@ -1016,11 +1012,11 @@ public class L2Attackable extends L2Npc
 				{
 					return;
 				}
-				ai.addHate(-amount);
+				ai.addHate(amount);
 			}
 			
 			amount = getHating(mostHated);
-			if (amount <= 0)
+			if (amount >= 0)
 			{
 				((L2AttackableAI) getAI()).setGlobalAggro(-25);
 				clearAggroList();
@@ -1033,19 +1029,17 @@ public class L2Attackable extends L2Npc
 		AggroInfo ai = getAggroList().get(target);
 		if (ai == null)
 		{
+			_log.info("target " + target + " not present in aggro list of " + this);
 			return;
 		}
 		
-		ai.addHate(-amount);
-		if (ai.getHate() <= 0)
+		ai.addHate(amount);
+		if ((ai.getHate() >= 0) && (getMostHated() == null))
 		{
-			if (getMostHated() == null)
-			{
-				((L2AttackableAI) getAI()).setGlobalAggro(-25);
-				clearAggroList();
-				getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
-				setWalking();
-			}
+			((L2AttackableAI) getAI()).setGlobalAggro(-25);
+			clearAggroList();
+			getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+			setWalking();
 		}
 	}
 	
@@ -1973,14 +1967,6 @@ public class L2Attackable extends L2Npc
 		return null;
 	}
 	
-	/**
-	 * @return True if the _aggroList of this L2Attackable is Empty.
-	 */
-	public boolean noTarget()
-	{
-		return getAggroList().isEmpty();
-	}
-	
 	/**
 	 * @param player The L2Character searched in the _aggroList of the L2Attackable
 	 * @return True if the _aggroList of this L2Attackable contains the L2Character.

+ 21 - 27
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -6203,7 +6203,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				if (tgt.isPlayable())
 				{
 					L2Character target = (L2Character) tgt;
-					
 					if (skill.getSkillType() == L2SkillType.BUFF)
 					{
 						SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
@@ -6216,6 +6215,18 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 						((L2Summon) target).updateAndBroadcastStatus(1);
 					}
 				}
+				else if (isPlayable() && tgt.isL2Attackable())
+				{
+					L2Character target = (L2Character) tgt;
+					if (skill.getEffectPoint() > 0)
+					{
+						((L2Attackable) target).reduceHate(this, skill.getEffectPoint());
+					}
+					else if (skill.getEffectPoint() < 0)
+					{
+						((L2Attackable) target).addDamageHate(this, 0, -skill.getEffectPoint());
+					}
+				}
 			}
 			
 			StatusUpdate su = new StatusUpdate(this);
@@ -6693,17 +6704,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 								}
 							}
 							// notify target AI about the attack
-							if (((L2Character) target).hasAI())
+							if (((L2Character) target).hasAI() && !skill.hasEffectType(L2EffectType.HATE))
 							{
-								switch (skill.getSkillType())
-								{
-									case AGGREDUCE:
-									case AGGREDUCE_CHAR:
-									case AGGREMOVE:
-										break;
-									default:
-										((L2Character) target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
-								}
+								((L2Character) target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
 							}
 						}
 						else
@@ -6752,24 +6755,15 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				}
 			}
 			// Notify AI
-			if (skill.isOffensive())
+			if (skill.isOffensive() && !skill.hasEffectType(L2EffectType.HATE))
 			{
-				switch (skill.getSkillType())
+				for (L2Object target : targets)
 				{
-					case AGGREDUCE:
-					case AGGREDUCE_CHAR:
-					case AGGREMOVE:
-						break;
-					default:
-						for (L2Object target : targets)
-						{
-							if ((target instanceof L2Character) && ((L2Character) target).hasAI())
-							{
-								// notify target AI about the attack
-								((L2Character) target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
-							}
-						}
-						break;
+					if ((target instanceof L2Character) && ((L2Character) target).hasAI())
+					{
+						// notify target AI about the attack
+						((L2Character) target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
+					}
 				}
 			}
 		}

+ 11 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java

@@ -554,15 +554,7 @@ public final class L2CubicInstance
 								target
 							};
 							
-							if (type == L2SkillType.AGGDAMAGE)
-							{
-								if (Config.DEBUG)
-								{
-									_log.info("L2CubicInstance: Action.run() handler " + type);
-								}
-								useCubicDisabler(type, L2CubicInstance.this, skill, targets);
-							}
-							else if (type == L2SkillType.DEBUFF)
+							if (type == L2SkillType.DEBUFF)
 							{
 								if (Config.DEBUG)
 								{
@@ -611,6 +603,14 @@ public final class L2CubicInstance
 								}
 								useCubicContinuous(L2CubicInstance.this, skill, targets);
 							}
+							else if (skill.hasEffectType(L2EffectType.AGGRESSION))
+							{
+								if (Config.DEBUG)
+								{
+									_log.info("L2CubicInstance: Action.run() handler " + type);
+								}
+								useCubicDisabler(type, L2CubicInstance.this, skill, targets);
+							}
 							
 							// The cubic has done an action, increase the currentcount
 							_currentcount++;
@@ -824,11 +824,11 @@ public final class L2CubicInstance
 				}
 			}
 			
-			if (type == L2SkillType.AGGDAMAGE)
+			if (skill.hasEffectType(L2EffectType.AGGRESSION))
 			{
 				if (Formulas.calcCubicSkillSuccess(activeCubic, target, skill, shld))
 				{
-					if (target instanceof L2Attackable)
+					if (target.isL2Attackable())
 					{
 						target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, activeCubic.getOwner(), (int) ((150 * skill.getPower()) / (target.getLevel() + 7)));
 					}

+ 3 - 24
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -2316,14 +2316,7 @@ public final class L2PcInstance extends L2Playable
 		
 		// calc weapon penalty
 		weaponPenalty = weaponPenalty - expertiseLevel - bonus;
-		if (weaponPenalty < 0)
-		{
-			weaponPenalty = 0;
-		}
-		else if (weaponPenalty > 4)
-		{
-			weaponPenalty = 4;
-		}
+		weaponPenalty = Math.min(Math.max(weaponPenalty, 0), 4);
 		
 		if ((getExpertiseWeaponPenalty() != weaponPenalty) || (getSkillLevel(FrequentSkill.WEAPON_GRADE_PENALTY.getId()) != weaponPenalty))
 		{
@@ -2341,14 +2334,7 @@ public final class L2PcInstance extends L2Playable
 		
 		// calc armor penalty
 		armorPenalty = armorPenalty - expertiseLevel - bonus;
-		if (armorPenalty < 0)
-		{
-			armorPenalty = 0;
-		}
-		else if (armorPenalty > 4)
-		{
-			armorPenalty = 4;
-		}
+		armorPenalty = Math.min(Math.max(armorPenalty, 0), 4);
 		
 		if ((getExpertiseArmorPenalty() != armorPenalty) || (getSkillLevel(FrequentSkill.ARMOR_GRADE_PENALTY.getId()) != armorPenalty))
 		{
@@ -2490,14 +2476,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void setFame(int fame)
 	{
-		if (fame > Config.MAX_PERSONAL_FAME_POINTS)
-		{
-			_fame = Config.MAX_PERSONAL_FAME_POINTS;
-		}
-		else
-		{
-			_fame = fame;
-		}
+		_fame = (fame > Config.MAX_PERSONAL_FAME_POINTS) ? Config.MAX_PERSONAL_FAME_POINTS : fame;
 	}
 	
 	/**

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/knownlist/GuardKnownList.java

@@ -89,8 +89,8 @@ public class GuardKnownList extends AttackableKnownList
 			return false;
 		}
 		
-		// Check if the _aggroList of the L2GuardInstance is Empty
-		if (getActiveChar().noTarget())
+		// Check if the aggression list of this guard is empty.
+		if (getActiveChar().getAggroList().isEmpty())
 		{
 			// Set the L2GuardInstance to AI_INTENTION_IDLE
 			if (getActiveChar().hasAI())

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/L2EffectType.java

@@ -24,6 +24,7 @@ package com.l2jserver.gameserver.model.effects;
  */
 public enum L2EffectType
 {
+	AGGRESSION,
 	BLOCK_RESURRECTION,
 	BUFF,
 	CHARM_OF_LUCK,
@@ -46,6 +47,7 @@ public enum L2EffectType
 	FATAL_BLOW,
 	FEAR,
 	FUSION,
+	HATE,
 	HEAL,
 	HEAL_OVER_TIME,
 	HEAL_PERCENT,
@@ -82,7 +84,6 @@ public enum L2EffectType
 	STATIC_DAMAGE,
 	STUN,
 	SUMMON_PET,
-	TARGET_ME,
 	TELEPORT,
 	TELEPORT_TO_TARGET,
 	TRANSFORMATION,

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -196,7 +196,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final int _lethalStrikeRate;
 	private final boolean _directHpDmg; // If true then damage is being make directly
 	private final boolean _isTriggeredSkill; // If true the skill will take activation buff slot instead of a normal buff slot
-	private final int _aggroPoints;
+	private final int _effectPoint;
 	// Condition lists
 	private List<Condition> _preCondition;
 	private List<Condition> _itemPreCondition;
@@ -407,7 +407,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		_directHpDmg = set.getBool("dmgDirectlyToHp", false);
 		_isTriggeredSkill = set.getBool("isTriggeredSkill", false);
-		_aggroPoints = set.getInteger("aggroPoints", 0);
+		_effectPoint = set.getInteger("effectPoint", 0);
 		
 		_flyType = set.getString("flyType", null);
 		_flyRadius = set.getInteger("flyRadius", 0);
@@ -854,9 +854,9 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isTriggeredSkill;
 	}
 	
-	public final int getAggroPoints()
+	public final int getEffectPoint()
 	{
-		return _aggroPoints;
+		return _effectPoint;
 	}
 	
 	public final boolean useSoulShot()

+ 0 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2SkillType.java

@@ -38,12 +38,6 @@ public enum L2SkillType
 	SIGNET_CASTTIME(L2SkillSignetCasttime.class),
 	// reco
 	GIVE_RECO,
-	// Aggro
-	AGGDAMAGE,
-	AGGREDUCE,
-	AGGREMOVE,
-	AGGREDUCE_CHAR,
-	AGGDEBUFF,
 	// Fishing
 	FISHING,
 	PUMPING,
@@ -76,7 +70,6 @@ public enum L2SkillType
 	RESURRECT,
 	DETECT_TRAP,
 	REMOVE_TRAP,
-	SHIFT_TARGET,
 	
 	// Skill is done within the core.
 	COREDONE,

+ 19 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -2289,4 +2289,23 @@ public final class Formulas
 		}
 		return time;
 	}
+	
+	/**
+	 * Calculate Probability in following effects:<br>
+	 * TargetCancel,<br>
+	 * TargetMeProbability,<br>
+	 * SkillTurning,<br>
+	 * Betray,<br>
+	 * Bluff<br>
+	 * @param baseChance chance from effect parameter
+	 * @param attacker
+	 * @param target
+	 * @param skill
+	 * @return chance for effect to succeed
+	 */
+	public static boolean calcProbability(double baseChance, L2Character attacker, L2Character target, L2Skill skill)
+	{
+		return Rnd.get(100) < (((((skill.getMagicLevel() + baseChance) - target.getLevel()) + 30) - target.getINT()) * Formulas.calcElemental(attacker, target, skill));
+	}
+	
 }

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Stats.java

@@ -108,7 +108,6 @@ public enum Stats
 	// VARIOUS
 	BREATH("breath"),
 	FALL("fall"),
-	AGGRESSION("aggression"), // locks a mob on tank caster
 	
 	// VULNERABILITIES
 	BLEED_VULN("bleedVuln"),