Jump to content
  • 0

Anti-KS System


Statique

Question

It is very annoying usually in server with farming zones and mobs which they won't die easily when the player is about to kill it someone else comes up makes the last hit and takes the reward. Can somehow make a way to give the reward to the player which has the player on him which means if I keep hitting a mob it faces me and hits me if somebody else comes and starts hitting if his damage is more that mine he will take the mob toward him and the mob will start hitting him instead of me, what I want to do that the reward from the mob should take the person who has the mob on him which means that the reward should go to the player who has the mob on him and hits him.

 

confusing...

 

thanks in advance...

Link to comment
Share on other sites

Recommended Posts

  • 0

Index: E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(revision 4014)
+++ E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(working copy)
@@ -2087,7 +2087,20 @@
         
         if (this instanceof L2PcInstance && ((L2PcInstance)this).getAgathionId() != 0)
         	((L2PcInstance)this).setAgathionId(0);
-		calculateRewards(killer);
+        
+        DmgInfo dmger = null;
+        double dmg = 0;
+        
+        for(DmgInfo dmgs : _agroMap.values())
+        {
+        	if(dmgs.dmg > dmg)
+        	{
+        		dmg = dmgs.dmg;
+        		dmger = dmgs;
+        	}
+        }
+        
+		calculateRewards(dmger.attacker != null ? _agroMap.get(dmg).attacker : killer);
+		_agroMap.clear();
		// Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform
		broadcastStatusUpdate();
@@ -6777,8 +6790,8 @@
	public final int getWalkSpeed() { return getStat().getWalkSpeed(); }
	public int getWIT() { return getStat().getWIT(); }
	// =========================================================
-
-
+	class DmgInfo{ L2Character attacker; double dmg; public DmgInfo(L2Character att) { attacker = att; }}
+	private FastMap<L2Character, DmgInfo> _agroMap;
	// =========================================================
	// Status - NEED TO REMOVE ONCE L2CHARTATUS IS COMPLETE
	// Method - Public
@@ -6791,6 +6804,13 @@
			getStatus().reduceHp(i/Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT, false);
		else
			getStatus().reduceHp(i, attacker, awake, isDOT, false);
+		
+		if(this instanceof L2Attackable && attacker.getActingPlayer() != null) // simple check XD
+		{
+			DmgInfo lastDmg = _agroMap.containsKey(attacker) ? _agroMap.get(attacker) : new DmgInfo(attacker);
+			lastDmg.dmg += i;
+			_agroMap.put(attacker, lastDmg);
+		}
	}
	public void reduceCurrentMp(double i) { getStatus().reduceMp(i); }
	public void removeStatusListener(L2Character object) { getStatus().removeStatusListener(object); }

 

There u go simple, clean and precise.

Link to comment
Share on other sites

  • 0

that is same like my just you add that in another place maby some better but i am still learning and that simple error isnt so bad, summarizing my code is good

code cleanliness and performance should be of importance :P

yours dose the same thing only that the code is every where :)

And im not arguing im teaching :P

Link to comment
Share on other sites

  • 0

I tried to add it but it didn't worked.

It would be easier if it just gives the reward to the player who has the aggro on him, I think...

 

ex. calculateRewards(killer);

Somehow to change it and give the reward to the guy who has the aggro instead of the killer...

Link to comment
Share on other sites

  • 0

Index: E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(revision 4014)
+++ E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(working copy)
@@ -2087,7 +2087,20 @@
         
         if (this instanceof L2PcInstance && ((L2PcInstance)this).getAgathionId() != 0)
         	((L2PcInstance)this).setAgathionId(0);
-		calculateRewards(killer);
+        
+        DmgInfo dmger = null;
+        double dmg = 0;
+        
+        for(DmgInfo dmgs : _agroMap.values())
+        {
+        	if(dmgs.dmg > dmg)
+        	{
+        		dmg = dmgs.dmg;
+        		dmger = dmgs;
+        	}
+        }
+        
+		calculateRewards(dmger.attacker != null ? _agroMap.get(dmg).attacker : killer);
+		_agroMap.clear();
		// Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform
		broadcastStatusUpdate();
@@ -6777,8 +6790,8 @@
	public final int getWalkSpeed() { return getStat().getWalkSpeed(); }
	public int getWIT() { return getStat().getWIT(); }
	// =========================================================
-
-
+	class DmgInfo{ L2Character attacker; double dmg; public DmgInfo(L2Character att) { attacker = att; }}
+	private FastMap<L2Character, DmgInfo> _agroMap;
	// =========================================================
	// Status - NEED TO REMOVE ONCE L2CHARTATUS IS COMPLETE
	// Method - Public
@@ -6791,6 +6804,13 @@
			getStatus().reduceHp(i/Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT, false);
		else
			getStatus().reduceHp(i, attacker, awake, isDOT, false);
+		
+		if(this instanceof L2Attackable && attacker.getActingPlayer() != null) // simple check XD
+		{
+			DmgInfo lastDmg = _agroMap.containsKey(attacker) ? _agroMap.get(attacker) : new DmgInfo(attacker);
+			lastDmg.dmg += i;
+			_agroMap.put(attacker, lastDmg);
+		}
	}
	public void reduceCurrentMp(double i) { getStatus().reduceMp(i); }
	public void removeStatusListener(L2Character object) { getStatus().removeStatusListener(object); }

 

There u go simple, clean and precise.

 

Tried to adapt it to l2jfree but I get this error now (mob doesnt die anymore):

 

WARNING [24 Mar 21:56:26,928] com.l2jfree.util.concurrent.ExecuteWrapper.execute(): Exception in a Runnable execution:

java.lang.NullPointerException

at com.l2jfree.gameserver.model.actor.L2Character.doDie(L2Character.java:2030)

at com.l2jfree.gameserver.model.actor.L2Npc.doDie(L2Npc.java:2638)

at com.l2jfree.gameserver.model.actor.L2Attackable.doDie(L2Attackable.java:422)

at com.l2jfree.gameserver.model.actor.instance.L2MonsterInstance.doDie(L2MonsterInstance.java:214)

at com.l2jfree.gameserver.model.actor.status.CharStatus.reduceHp0(CharStatus.java:268)

at com.l2jfree.gameserver.model.actor.status.NpcStatus.reduceHp0(NpcStatus.java:32)

at com.l2jfree.gameserver.model.actor.status.AttackableStatus.reduceHp0(AttackableStatus.java:85)

at com.l2jfree.gameserver.model.actor.status.CharStatus.reduceHp(CharStatus.java:227)

at com.l2jfree.gameserver.model.actor.status.CharStatus.reduceHp(CharStatus.java:219)

at com.l2jfree.gameserver.model.actor.status.CharStatus.reduceHp(CharStatus.java:210)

at com.l2jfree.gameserver.model.actor.L2Character.reduceCurrentHp(L2Character.java:6707)

at com.l2jfree.gameserver.model.actor.L2Character.onHitTimer(L2Character.java:5237)

at com.l2jfree.gameserver.model.actor.L2Character$HitTask.run(L2Character.java:2785)

at com.l2jfree.util.concurrent.ExecuteWrapper.execute(ExecuteWrapper.java:59)

at com.l2jfree.util.concurrent.ExecuteWrapper.run(ExecuteWrapper.java:40)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

at java.util.concurrent.FutureTask.run(FutureTask.java:138)

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:207)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:619)

 

???

Link to comment
Share on other sites

  • 0

I tried to add it but it didn't worked.

It would be easier if it just gives the reward to the player who has the aggro on him, I think...

 

ex. calculateRewards(killer);

Somehow to change it and give the reward to the guy who has the aggro instead of the killer...

that must work on gracja final l2j nightly files becouse i test it, if you use my script you need copy config from compiled files and write ther moobs who will be work with "best dmg reward"

Link to comment
Share on other sites

  • 0

The problem with this code is that a clever player could do adequate damage, move to next mob and let others finish it.

Especially if ur server uses custom raids or something that gives huge drop.

 

Could u tell me if u are using auto loot, or drops are on the ground?

 

hint: get.mostHated()

Link to comment
Share on other sites

  • 0

Index: E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(revision 4014)
+++ E:/L2j Development/workspace/L2_GameServer-clean/java/com/l2jserver/gameserver/model/actor/L2Character.java	(working copy)
@@ -2087,7 +2087,20 @@
         
         if (this instanceof L2PcInstance && ((L2PcInstance)this).getAgathionId() != 0)
         	((L2PcInstance)this).setAgathionId(0);
-		calculateRewards(killer);
+        
+        DmgInfo dmger = null;
+        double dmg = 0;
+        
+        for(DmgInfo dmgs : _agroMap.values())
+        {
+        	if(dmgs.dmg > dmg)
+        	{
+        		dmg = dmgs.dmg;
+        		dmger = dmgs;
+        	}
+        }
+        
+		calculateRewards(dmger.attacker != null ? _agroMap.get(dmg).attacker : killer);
+		_agroMap.clear();
		// Send the Server->Client packet StatusUpdate with current HP and MP to all other L2PcInstance to inform
		broadcastStatusUpdate();
@@ -6777,8 +6790,8 @@
	public final int getWalkSpeed() { return getStat().getWalkSpeed(); }
	public int getWIT() { return getStat().getWIT(); }
	// =========================================================
-
-
+	class DmgInfo{ L2Character attacker; double dmg; public DmgInfo(L2Character att) { attacker = att; }}
+	private FastMap<L2Character, DmgInfo> _agroMap;
	// =========================================================
	// Status - NEED TO REMOVE ONCE L2CHARTATUS IS COMPLETE
	// Method - Public
@@ -6791,6 +6804,13 @@
			getStatus().reduceHp(i/Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT, false);
		else
			getStatus().reduceHp(i, attacker, awake, isDOT, false);
+		
+		if(this instanceof L2Attackable && attacker.getActingPlayer() != null) // simple check XD
+		{
+			DmgInfo lastDmg = _agroMap.containsKey(attacker) ? _agroMap.get(attacker) : new DmgInfo(attacker);
+			lastDmg.dmg += i;
+			_agroMap.put(attacker, lastDmg);
+		}
	}
	public void reduceCurrentMp(double i) { getStatus().reduceMp(i); }
	public void removeStatusListener(L2Character object) { getStatus().removeStatusListener(object); }

 

There u go simple, clean and precise.

 

What changes can i do ? Cuz doesn't work on interlude.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...