Quote:
Originally Posted by tupas3
The 1st time i started this v0.1 it only effected my atacking speed but the 2nd time it effected moving and so. how to make it only atacking speed?
|
To make it only affect attacking speed u have to find that exact value that controls the attack speed, delay, cooldown and its all possible using cheatengine... If u use speedhack on its own, you will speed everything up..
Quote:
Originally Posted by mkx
this hack only effects run speed?
Im playing on Infinite Aion
|
In Infinite yea.. basically its because Infinite Aion is an advance private server that make uses anti-speedhack method to block speedhack. The method we all used is to bypass this but happens it only affects walking, running, healing, dodging, flying and teleporting speed..
That's why there is a major huge difference when u try that hack and use it on other servers besides at Infinite.
Just a basic plugin, Infinite Aion used to dc players that are speedhacking. (Credits to Lokizer for this)
Code:
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/Player.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/Player.java (revision 1676)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/Player.java (working copy)
@@ -31,6 +31,7 @@
import com.aionemu.gameserver.model.gameobjects.PersistentState;
import com.aionemu.gameserver.model.gameobjects.player.listeners.PlayerLoggedInListener;
import com.aionemu.gameserver.model.gameobjects.player.listeners.PlayerLoggedOutListener;
+import com.aionemu.gameserver.model.gameobjects.player.speedhack.SpeedHack;
import com.aionemu.gameserver.model.gameobjects.state.CreatureVisualState;
import com.aionemu.gameserver.model.gameobjects.stats.PlayerGameStats;
import com.aionemu.gameserver.model.gameobjects.stats.PlayerLifeStats;
@@ -88,6 +89,7 @@
private CraftingTask craftingTask;
private int flightTeleportId;
private int flightDistance;
+ private SpeedHack speedHack;
/**
* Static information for players
@@ -110,6 +112,7 @@
this.requester = new ResponseRequester(this);
this.questStateList = new QuestStateList();
this.titleList = new TitleList();
+ this.speedHack = new SpeedHack(this);
controller.setOwner(this);
}
@@ -814,6 +817,14 @@
return isInVisualState(CreatureVisualState.BLINKING);
}
+ /**
+ * @SpeedHack controller
+ */
+ public SpeedHack getSpeedHack()
+ {
+ return speedHack;
+ }
+
/**
* Check is player is invul
*
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/PlayerController.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/PlayerController.java (revision 1676)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/PlayerController.java (working copy)
@@ -257,6 +257,11 @@
if(!player.canAttack())
return;
+ if(!player.getSpeedHack().getSHAttackSpeedCheck().canAttackYet())
+ return;
+
+ player.getSpeedHack().getSHAttackSpeedCheck().generateAttackTimeStamp();
+
PlayerGameStats gameStats = player.getGameStats();
Creature target = (Creature) sp.getWorld().findAionObject(targetObjectId);
@@ -333,6 +338,7 @@
public void onStopMove()
{
super.onStopMove();
+ getOwner().getHeading();
}
@Override
@@ -340,6 +346,9 @@
{
if(this.getOwner().isCasting())
{
+ // used for removing skillId from anti speed hack used skill map
+ this.getOwner().getSpeedHack().getSHSkillUseCheck().removeUsedSkills(this.getOwner().getCastingSkillId());
+
this.getOwner().setCasting(null);
PacketSendUtility.sendPacket(this.getOwner(), new SM_SKILL_CANCEL(this.getOwner()));
PacketSendUtility.sendPacket(this.getOwner(), SM_SYSTEM_MESSAGE.STR_SKILL_CANCELED());
@@ -464,6 +473,7 @@
PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player));
// add new skills
+ sp.getSkillLearnService().addMissingSkills(player);
sp.getSkillLearnService().addNewSkills(player, false);
if(level == 10)
{
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/PlayerService.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/PlayerService.java (revision 1676)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/PlayerService.java (working copy)
@@ -379,6 +379,9 @@
player.getCommonData().setOnline(true);
DAOManager.getDAO(PlayerDAO.class).onlinePlayer(player, true);
player.onLoggedIn();
+
+ // reset speed hack stuff to zero
+ player.getSpeedHack().resetSpeedHack();
}
/**
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/skillengine/model/Skill.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/skillengine/model/Skill.java (revision 1676)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/skillengine/model/Skill.java (working copy)
@@ -119,6 +119,13 @@
//start casting
effector.setCasting(this);
+ // ----- check cooldown exploit (speedhack) --- /
+ if((effector instanceof Player) &&
+ !((Player)effector).getSpeedHack().getSHSkillUseCheck().canUseThatSkillYet(skillTemplate.getSkillId(),
+ skillTemplate.getCooldown()))
+ return;
+ // ----- end of speed hack check -------------- /
+
Iterator<Creature> effectedIter = effectedList.iterator();
while(effectedIter.hasNext())
{
@@ -186,6 +193,11 @@
//stop casting must be before preUsageCheck()
effector.setCasting(null);
+ // ----- speed hack check ------------------- /
+ if(effector instanceof Player)
+ ((Player)effector).getSpeedHack().getSHSkillUseCheck().addUsedSkill(skillTemplate.getSkillId());
+ // ----- end of speed hack check ------------ /
+
if(!preUsageCheck())
return;
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SpeedHack.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SpeedHack.java (revision 0)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SpeedHack.java (revision 0)
@@ -0,0 +1,94 @@
+package com.aionemu.gameserver.model.gameobjects.player.speedhack;
+
+import com.aionemu.gameserver.model.gameobjects.player.Player;
+import com.aionemu.gameserver.model.gameobjects.player.speedhack.SHAttackSpeedCheck;
+import com.aionemu.gameserver.model.gameobjects.player.speedhack.SHSkillUseCheck;
+import com.aionemu.gameserver.utils.PacketSendUtility;
+
+public class SpeedHack {
+
+ private Player player;
+ private SHAttackSpeedCheck shAttackSpeedCheck;
+ private SHSkillUseCheck shSkillUseCheck;
+
+ private int speedhackcounter = 0;
+ private int maxAbusedAttempt = 200; // more than this attempt, then dc the client
+ // only applied on regular attack hit, movement + skill only prevented not dc-ed
+
+ public SpeedHack(Player player)
+ {
+ this.player = player;
+ shAttackSpeedCheck = new SHAttackSpeedCheck(player);
+ shSkillUseCheck = new SHSkillUseCheck(player);
+ }
+
+ /**
+ * this method is use for getting how many times speed hack attempt is triggered.
+ *
+ * @return how many times speed hack attempt triggered.
+ */
+ public int getCurrentCounter()
+ {
+ return speedhackcounter;
+ }
+
+ /**
+ * this method is use to add counter for speed hack attempt.
+ */
+ public void addCounter()
+ {
+ speedhackcounter++;
+ }
+
+ /**
+ * this method is use to get maxAbusedAttempt for speed hack
+ *
+ * @return
+ */
+ public int getMaxAbusedAttempt()
+ {
+ return maxAbusedAttempt;
+ }
+
+ public SHAttackSpeedCheck getSHAttackSpeedCheck()
+ {
+ return shAttackSpeedCheck;
+ }
+
+ public SHSkillUseCheck getSHSkillUseCheck()
+ {
+ return shSkillUseCheck;
+ }
+
+
+ /**
+ * this method is use to check if player is abusing too much attempt of speed hack detection.
+ *
+ * @return true if player is abusing too much or false if not.
+ */
+ public boolean isAbusingTooMuch()
+ {
+ if(speedhackcounter >= maxAbusedAttempt)
+ return true;
+ else
+ return false;
+ }
+
+ /**
+ * this method is use to schedule client disconnect
+ */
+ public void doSpeedHackDisconnectClient()
+ {
+ PacketSendUtility.sendMessage(player, "You have been triggered Speed Hack detection so you're disconnected.");
+ player.getClientConnection().close(true);
+ }
+
+ /**
+ * this method is used to reset speed hack counter and skill used maps.
+ */
+ public void resetSpeedHack()
+ {
+ getSHSkillUseCheck().clearUsedSkills();
+ this.speedhackcounter = 0;
+ }
+}
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHAttackSpeedCheck.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHAttackSpeedCheck.java (revision 0)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHAttackSpeedCheck.java (revision 0)
@@ -0,0 +1,74 @@
+package com.aionemu.gameserver.model.gameobjects.player.speedhack;
+
+import com.aionemu.gameserver.model.gameobjects.player.Player;
+import com.aionemu.gameserver.model.gameobjects.stats.StatEnum;
+
+public class SHAttackSpeedCheck {
+
+ private Long lastAttackTime;
+ private Player player;
+
+ public SHAttackSpeedCheck(Player player)
+ {
+ this.player = player;
+ }
+
+ /**
+ * This method is for getting current attack speed of player.
+ *
+ * @return attack speed of player.
+ */
+ public int getCurrentAtkSpeed()
+ {
+ return (int) player.getGameStats().getCurrentStat(StatEnum.ATTACK_SPEED);
+ }
+
+ /**
+ * This method is for generating attack time stamp.
+ */
+ public void generateAttackTimeStamp()
+ {
+ lastAttackTime = System.currentTimeMillis();
+ }
+
+ /**
+ * This method is for getting last physical attack time stamp for current player
+ *
+ * @return last physical attack time stamp.
+ *
+ */
+ public Long getLastAttackTime()
+ {
+ return lastAttackTime;
+ }
+
+ /**
+ * This method is for getting last physical attack timestamp for current player
+ *
+ * @return boolean true if player can attack, false if is not yet.
+ *
+ */
+ public boolean canAttackYet()
+ {
+ if(getLastAttackTime() != null)
+ {
+ Long timenow = System.currentTimeMillis();
+ int delta = Math.round(timenow - getLastAttackTime()) + (getCurrentAtkSpeed() / 2); //for now just to be safe max speed ;
+
+ if(getCurrentAtkSpeed() > delta)
+ {
+ //if happened certain times too fast, lets just disconnect the client to decrease server load.
+ if(player.getSpeedHack().isAbusingTooMuch())
+ {
+ player.getClientConnection().close(true);
+ }
+
+ player.getSpeedHack().addCounter();
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+}
Index: trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHSkillUseCheck.java
===================================================================
--- trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHSkillUseCheck.java (revision 0)
+++ trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/player/speedhack/SHSkillUseCheck.java (revision 0)
@@ -0,0 +1,94 @@
+package com.aionemu.gameserver.model.gameobjects.player.speedhack;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.aionemu.gameserver.model.gameobjects.player.Player;
+
+public class SHSkillUseCheck {
+
+ private Player player;
+ private ConcurrentHashMap <Integer, Long> usedSkills = new ConcurrentHashMap<Integer, Long>();
+
+ public SHSkillUseCheck(Player player)
+ {
+ this.player = player;
+ }
+
+ /**
+ * This method is for generating skill use time stamp.
+ *
+ * @return player skill time stamp when casting.
+ */
+ private Long generateSkillUseTime()
+ {
+ return System.currentTimeMillis() / 1000L;
+ }
+
+ /**
+ * This method is for checking if player is already using that skillId or not yet.
+ *
+ * @param skillid
+ * @return boolean true or false
+ */
+ private boolean isAlreadyUsedSkill(int skillid) {
+ return usedSkills.containsKey(skillid);
+ }
+
+ /**
+ * This method is for adding skillId that is going to be used.
+ * @param skillid
+ */
+ public void addUsedSkill(int skillid) {
+ Long timenow = generateSkillUseTime();
+
+ if (!isAlreadyUsedSkill(skillid))
+ usedSkills.put(skillid, timenow);
+
+ else
+ usedSkills.replace(skillid, timenow);
+ }
+
+ /**
+ * This method is use for check if player can use that particular skillid or not yet.
+ *
+ * @param skillid
+ * @param skillCoolDown
+ *
+ * @return boolean true if player can use or false if not.
+ */
+ public boolean canUseThatSkillYet(int skillid, int skillCoolDown) {
+
+ if (isAlreadyUsedSkill(skillid)) {
+ Long timenow = generateSkillUseTime();
+ Long lastTimeUsed = usedSkills.get(skillid);
+
+ int deltaCoolDown = Math.round(timenow - lastTimeUsed);
+ deltaCoolDown = deltaCoolDown + Math.round(skillCoolDown * 0.35f); //just to be safe
+
+ if (skillCoolDown > deltaCoolDown)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * This method is used to remove skillId from map when cast is canceled.
+ * @param skillId
+ */
+ public void removeUsedSkills(int skillId)
+ {
+ if(usedSkills.containsKey(skillId))
+ usedSkills.remove(skillId);
+ }
+
+ /**
+ * This method is to clear all skillIds from the used skill map
+ */
+ public void clearUsedSkills() {
+ if(usedSkills != null)
+ usedSkills.clear();
+ }
+
+}