Jump to content

Recommended Posts

Posted

Hey all. It's been long since i was active here..

So i wanted so share sth i created for a server that i was working on, it's the custom cancel that the buffs return after x time..

 

CustomCancelTask.java

/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
* 
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
* 
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.model.entity.custom;

import java.util.Vector;

import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;

/**
* @author Anarchy
*
*/
public class CustomCancelTask implements Runnable
{
private L2PcInstance _player = null;
private Vector<L2Skill> _buffs = null;

public CustomCancelTask(L2PcInstance _player, Vector<L2Skill> _buffs)
{
	this._player = _player;
	this._buffs = _buffs;
}

@Override
public void run()
{
	if (_player == null || !_player.isOnline())
	{
		return;
	}
	for (L2Skill s : _buffs)
	{
		if (s == null)
		{
			continue;
		}

		s.getEffects(_player, _player);
	}
}
}

 

And on gameserver/handlers/skillhandlers/Cancel.java

 

Add:

Vector<L2Skill> cancelledBuffs = new Vector<>();

 

Above these variables:

 

int lastCanceledSkillId = 0;

int count = skill.getMaxNegatedEffects();

 

And add:

					if (!cancelledBuffs.contains(effect.getSkill()))
					{
						cancelledBuffs.add(effect.getSkill());
					}

 

Under this maybe:

 

// Stores the last canceled skill for further use.

lastCanceledSkillId = effect.getSkill().getId();

 

And finally add at the end of the method:

		if (cancelledBuffs.size() > 0)
		{
			ThreadPoolManager.getInstance().scheduleGeneral(new CustomCancelTask((L2PcInstance)target, cancelledBuffs), 5*1000);
		}

 

(Where 5 here is the seconds you want to delay until give the buffs back.)

 

However i would like to mention a few stuff:

- It was lazy coded, to be honest, since it gives the buff with full buff time.

- It can be used as bug, due to the above.

- It is coded on aCis.

- Sorry for not patch file but i committed that and the svn was deleted.

 

:) :)

 

Update:

 

These 2 patches should fix the code to work as it should. It was Justice's request.

 

-import java.util.Vector;
+import javolution.util.FastMap;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.ThreadPoolManager;
@@ -52,7 +52,7 @@
         // Get skill power (which is used as baseRate).
         final double skillPower = skill.getPower();
         
-        Vector<L2Skill> cancelledBuffs = new Vector<>();
+        FastMap<L2Skill, int[]> cancelledBuffs = new FastMap<>();
         
         for (L2Object obj : targets)
         {
@@ -108,9 +108,9 @@
                     // Stores the last canceled skill for further use.
                     lastCanceledSkillId = effect.getSkill().getId();
                     
-                    if (!cancelledBuffs.contains(effect.getSkill()))
+                    if (!cancelledBuffs.containsKey(effect.getSkill()))
                     {
-                        cancelledBuffs.add(effect.getSkill());
+                        cancelledBuffs.put(effect.getSkill(), new int[] { effect.getCount(), effect.getTime() });
                     }
                     
                     // Exit the effect.

 

package net.sf.l2j.gameserver.model.entity.custom;

-import java.util.Vector;
+import javolution.util.FastMap;

+import net.sf.l2j.gameserver.model.L2Effect;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.skills.Env;
+import net.sf.l2j.gameserver.skills.effects.EffectTemplate;

/**
  * @author Anarchy
@@ -26,9 +29,9 @@
public class CustomCancelTask implements Runnable
{
     private L2PcInstance _player = null;
-    private Vector<L2Skill> _buffs = null;
+    private FastMap<L2Skill, int[]> _buffs = null;
         
-    public CustomCancelTask(L2PcInstance _player, Vector<L2Skill> _buffs)
+    public CustomCancelTask(L2PcInstance _player, FastMap<L2Skill, int[]> _buffs)
     {
         this._player = _player;
         this._buffs = _buffs;
@@ -42,7 +45,7 @@
             return;
         }
             
-        for (L2Skill s : _buffs)
+        for (L2Skill s : _buffs.keySet())
         {
             if (s == null)
             {
@@ -49,7 +52,21 @@
                 continue;
             }
                 
-            s.getEffects(_player, _player);
+             Env env = new Env();
+             env.player = _player;
+             env.target = _player;
+             env.skill = s;
+             L2Effect ef;
+             for (EffectTemplate et : s.getEffectTemplates())
+             {
+                ef = et.getEffect(env);
+                 if (ef != null)
+                 {
+                     ef.setCount(_buffs.get(s)[0]);
+                     ef.setFirstTime(_buffs.get(s)[1]);
+                     ef.scheduleEffect();
+                 }
+             }
         }
     }
}
\ No newline at end of file

 

Btw, i have to say a big sorry for the blindness my old cancel code for l2elcardia caused to Elfocrash and Pauler  :alone:

Posted

this wasnt shared by rizzla?

Hey all. It's been long since i was active here..

So i wanted so share sth i created for a server that i was working on, it's the custom cancel that the buffs return after x time..

 

CustomCancelTask.java

/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
* 
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
* 
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.model.entity.custom;

import java.util.Vector;

import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;

/**
* @author Anarchy
*
*/
public class CustomCancelTask implements Runnable
{
private L2PcInstance _player = null;
private Vector<L2Skill> _buffs = null;

public CustomCancelTask(L2PcInstance _player, Vector<L2Skill> _buffs)
{
	this._player = _player;
	this._buffs = _buffs;
}

@Override
public void run()
{
	if (_player == null || !_player.isOnline())
	{
		return;
	}
	for (L2Skill s : _buffs)
	{
		if (s == null)
		{
			continue;
		}

		s.getEffects(_player, _player);
	}
}
}

 

And on gameserver/handlers/skillhandlers/Cancel.java

 

Add:

Vector<L2Skill> cancelledBuffs = new Vector<>();

 

Above these variables:

 

int lastCanceledSkillId = 0;

int count = skill.getMaxNegatedEffects();

 

And add:

					if (!cancelledBuffs.contains(effect.getSkill()))
					{
						cancelledBuffs.add(effect.getSkill());
					}

 

Under this maybe:

 

// Stores the last canceled skill for further use.

lastCanceledSkillId = effect.getSkill().getId();

 

And finally add at the end of the method:

		if (cancelledBuffs.size() > 0)
		{
			ThreadPoolManager.getInstance().scheduleGeneral(new CustomCancelTask((L2PcInstance)target, cancelledBuffs), 5*1000);
		}

 

(Where 5 here is the seconds you want to delay until give the buffs back.)

 

However i would like to mention a few stuff:

- It was lazy coded, to be honest, since it gives the buff with full buff time.

- It can be used as bug, due to the above.

- It is coded on aCis.

- Sorry for not patch file but i committed that and the svn was deleted.

 

:) :)

octapus,glad that you're back =]

sup?

 

nice idea anyway,thanks for sharing.

Posted

octapus,glad that you're back =]

sup?

 

nice idea anyway,thanks for sharing.

Hehe ;) As always, can't really quit l2j or this forum generally ;p Even if lol took over my pc for several months :D

 

Thanks mate :)

 

this wasnt shared by rizzla?

Well sorry if that's the case, but i was inactive for several months, as i mentioned above.. It should be locked if it exists then..

Posted

Yes, this custom cancellation was already shared as I remember, but I might be wrong.

Check both codes, and you will understand.
Posted

The code is diff from the one that is already shared... as i see

Someone test and reply, i'm waiting...

Romeo one was with bugs, i hope this one is bugless and will restore all buffs + self buffs..

Posted

This cancellation as I recall is exploitable in dueling system and olympiad games, you might want to check it out.

 

with some edits it can be perfect... i accept that any developer can do the restrictions since they are easy

Posted

with some edits it can be perfect... i accept that any developer can do the restrictions since they are easy

Indeed, that's why I was telling not to take only the raw code and apply it, it needs some adapting also.

Posted

Indeed, that's why I was telling not to take only the raw code and apply it, it needs some adapting also.

 

raw code?

raw code means FCA4 8CB8 48A8 4ACE 8488 9D48 94C9 464C

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



  • Posts

    • Both are in-game bots. I'm looking for an out-of-game bot ((one that doesn’t require the L2 client).     Hmm, never heard about this bot. Will check, thank you
    • 🎉 L2Mid is back! After a 3-year pause, we’re launching a new Interlude server based on the original Interlude client (old school 😉).   What to expect • The classic Interlude spirit • Old friends, rival clans, and returning legends • A season focused on pure nostalgia   This may be our final Interlude server. (maybe 😉) 🗓️ Opening: December 5, 2025 at 20:00 (GMT+2)   https://l2mid.com
    • Hello, i was wondering if there's a guide on how to add the enchanting armor glow system from  Ertheia or Lindvior to hi5?
    • I imported this file using Unreal Engine 2 Runtime, modified it, saved it back, and then placed it on the client. When I run the game and wear this back accessory, the client crashes!     2025.10.28 03:52:59 OS : Windows XP 5.1 (Build: 2600) CPU : GenuineIntel  Intel(R) Core(TM) i3-6100 CPU @ 3.70GHz @ 3697 MHz 1023MB RAM Video : NVIDIA GeForce GT 730 (3064) PosCode : TS4(273) -119:-62:-1474 4/1 [0] SkeletalMesh MFighter_Fuckl2jangel.MFighter_Fuckl2jangel: Serial size mismatch: Got 383399, Expected 383403 History: LoadObject <- (SkeletalMesh MFighter_Fuckl2jangel.MFighter_Fuckl2jangel 8376427==8376427/8376498 7993028 383403) <- ULinkerLoad::Preload <- PreLoadObjects <- UObject::EndLoad <- UObject::StaticLoadObject <- (Engine.Mesh MFighter_Fuckl2jangel.MFighter_Fuckl2jangel NULL) <- UMeshComponent::LoadMeshComponent <- UMeshContainer::UpdateMeshComponents <- APawn::UpdateMeshComponents <- User::UpdatePawnMeshContainerByItem <- User::UpdatePawnMeshContainer <- User::SetPawnResource <- NCPawnView_InvenItemWnd::OnRButtonDown <- NCVirtualWndMain::SetFocusingWindow <- NCVirtualWndMain::DispatchWndMsg <- NConsoleWnd::DispatchWndMsg <- NConsoleWnd::MasterConsoleEventProcess <- UEngine::InputEvent <- UWindowsViewport::CauseInputEvent <- UWindowsViewport::UpdateInput <- UViewport::ReadInput <- APlayerController::Tick <- ALineagePlayerController::Tick <- TickAllActors <- ULevel::Tick <- (NetMode=0) <- UMasterLevel::Tick <- TickLevel <- UGameEngine::Tick <- UpdateWorld <- MainLoop   I don't know what the reason is. Can you help me?
  • Topics

×
×
  • 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