Jump to content
  • 0

Question

Posted

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...

Recommended Posts

  • 0
Posted

idea isnt my, but code is good, just change last hit on best dmg on choise moobs, if code is "over exaggerated" i w8 for you offer, if i make some errors, that is normal becouse i am just a man

  • 0
Posted

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.

  • 0
Posted

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

  • 0
Posted

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

  • 0
Posted

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...

  • 0
Posted

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)

 

???

  • 0
Posted

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"

  • 0
Posted

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()

  • 0
Posted

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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock