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

    • So what if it is? Is someone forcing you to use it? Even if it's completely created by AI, what difference does that make to your life? I'd rather pay attention to @Nightw0lf feedback than listen to bullshit from some random person I've never seen do anything worthwhile on the internet.
    • If they ask you to write something, you should ask for the full context. We had a private chat between the administrators of mxc and gx ext. He was allowed back on the forum on the condition that he did not spam unnecessary posts. As far as I'm concerned, it shouldn't be allowed because it involves multiple scams. We want and aim for a stronger community. He's not only doing this with this account, but with several, since this user has multiple accounts. As for what one user or another contributes, that's irrelevant; I often provide support to the community and I don't need to make it public. But I repeat, if they ask you to write a comment, just ask for the full context, nothing more than that. Or if you want a direct answer from me, feel free to message me privately so we can avoid spamming a post about an extender. That's the problem with second chances 
    • I currently have a working custom quest, but the problem is that I can't see it in the game's quest log. I've added it to questname-e.dat, but I still don't see it. I think there's another file where I need to add it, but I can't find it. For the items and skills I've added, I've always put it in the name and grp fields, but there's nothing related to questgrp.dat in the quest log. Could you tell me where I can add it?
    • thats true, I try to keep my topsites clean of fake/paid votes I ban multiple accounts made by players my numbers are low but thats what I sacrifise to keep the vote system of the server owners that trust my topsites clean from multiple rewards.   @4TOP I would reply what happens here and how to fix but you replied you fixed that already.   Once the installation is completed, the script should create a marker file such as installed.txt or any other persistent flag that indicates the system is already installed.   In index.php, you must first check if this marker file exists. If it does not exist, redirect the user to install.php to start the installation process.   If the marker file exists, you must then check if install.php is still present. If it is, stop execution immediately and display an error requiring the user to delete the installer file, or remove it automatically for security reasons.   If the marker file exists and install.php does not exist, continue with the normal application execution.   This approach ensures the installation runs only once, prevents reinstallation attempts, and enforces removal of the installer for security.   NOTE: Do not trust the AI you can possibly destroy alot of things with AI, when you create a file you have to include some core protection logic to defend against common threats coming from the user input, that input should ALWAYS be treated as malicious, and check against what you expect versus not what was expected, for example: you input a username in a form the input $_POST['username'] can be anything malicious checking this global variable against an expected string or alnumeric a-Z0-9 is a way to check if the string contained other than expected chars now from that string you should apply some cleanup methods like regex in example: $raw_username = $_POST['username'] ?? ''; (personally i always use type casting) like: $raw_username = (string) ($_POST['username'] ?? ''); //or $raw_id = (int) ($_POST['item_id'] ?? 0); //array object etc... if (!is_string($raw_username) || $raw_username === '') { return 'Invalid input'; } if (preg_match('/^[a-zA-Z0-9]+$/', $raw_username) !== 1) { return 'Invalid characters'; } // do not execute the code further because return error stops the code   you can make various matches against other languages and such with the help of AI but you need to know the tricks and have a firewall logic that you build something that has to be protected, only then you can give a decent application in public that attackers can easily read and find the way in since this is a public repository this is an issue because the first rule is violated "security through obscurity" this is not a secret code and that means you have to protect it.   asside all that its a vote system for a game not that much of attack can happen, even atual studio survived such attacks except 1 that can fill a server with infinite donation coins 🙂 that few people know how to do it and still people use it so worry not. thats typical forgotten developer testing correction: $tokenOk = isset($top['token']) && hash_equals((string)$top['token'], $secret);
    • Great logic    Nothing is developed by you this looks like a very poor attemp to one shot a vote system with AI   $tokenOk = ($secret === 'TEST') || empty($top['token']) || hash_equals((string)$top['token'], $secret);  
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..