View difference between Paste ID: 61BqtkVs and uF5av9XB
SHOW: | | - or go back to the newest paste.
1
### Eclipse Workspace Patch 1.0
2
#P L2jMega_Interlude
3
diff --git java/Base/AutoFarm/AutofarmConstants.java java/Base/AutoFarm/AutofarmConstants.java
4
new file mode 100644
5
index 0000000..70e4aef
6
--- /dev/null
7
+++ java/Base/AutoFarm/AutofarmConstants.java
8
@@ -0,0 +1,11 @@
9
+package Base.AutoFarm;
10
+
11
+import java.util.Arrays;
12
+import java.util.List;
13
+
14
+public class AutofarmConstants 
15
+{
16
+    public final static List<Integer> attackSlots = Arrays.asList(0, 1, 2, 3);
17
+    public final static List<Integer> chanceSlots = Arrays.asList(4, 5, 6, 7);
18
+    public final static List<Integer> lowLifeSlots = Arrays.asList(8, 9, 10, 11);
19
+}
20
\ No newline at end of file
21
diff --git java/Base/AutoFarm/AutofarmPlayerRoutine.java java/Base/AutoFarm/AutofarmPlayerRoutine.java
22
new file mode 100644
23
index 0000000..68597fc
24
--- /dev/null
25
+++ java/Base/AutoFarm/AutofarmPlayerRoutine.java
26
@@ -0,0 +1,505 @@
27
+package Base.AutoFarm;
28
+
29
+
30
+
31
+import com.l2jmega.Config;
32
+import com.l2jmega.gameserver.geoengine.GeoEngine;
33
+import com.l2jmega.gameserver.handler.IItemHandler;
34
+import com.l2jmega.gameserver.handler.ItemHandler;
35
+import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedAutoFarm;
36
+import com.l2jmega.gameserver.model.L2ShortCut;
37
+import com.l2jmega.gameserver.model.L2Skill;
38
+import com.l2jmega.gameserver.model.WorldObject;
39
+import com.l2jmega.gameserver.model.WorldRegion;
40
+import com.l2jmega.gameserver.model.actor.Creature;
41
+import com.l2jmega.gameserver.model.actor.Summon;
42
+import com.l2jmega.gameserver.model.actor.ai.CtrlEvent;
43
+import com.l2jmega.gameserver.model.actor.ai.CtrlIntention;
44
+import com.l2jmega.gameserver.model.actor.ai.NextAction;
45
+import com.l2jmega.gameserver.model.actor.instance.Chest;
46
+import com.l2jmega.gameserver.model.actor.instance.Monster;
47
+import com.l2jmega.gameserver.model.actor.instance.Pet;
48
+import com.l2jmega.gameserver.model.actor.instance.Player;
49
+import com.l2jmega.gameserver.model.item.instance.ItemInstance;
50
+import com.l2jmega.gameserver.network.SystemMessageId;
51
+import com.l2jmega.gameserver.network.serverpackets.ActionFailed;
52
+import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage;
53
+import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
54
+import com.l2jmega.gameserver.network.serverpackets.SystemMessage;
55
+import com.l2jmega.gameserver.templates.skills.L2SkillType;
56
+
57
+import java.util.ArrayList;
58
+import java.util.Arrays;
59
+import java.util.Collections;
60
+import java.util.List;
61
+import java.util.concurrent.ScheduledFuture;
62
+import java.util.function.Function;
63
+import java.util.stream.Collectors;
64
+
65
+import com.l2jmega.commons.concurrent.ThreadPool;
66
+import com.l2jmega.commons.math.MathUtil;
67
+import com.l2jmega.commons.random.Rnd;
68
+
69
+public class AutofarmPlayerRoutine
70
+{
71
+	private final Player player;
72
+	private ScheduledFuture<?> _task;
73
+	private Creature committedTarget = null;
74
+
75
+	public AutofarmPlayerRoutine(Player player)
76
+	{
77
+		this.player = player;
78
+	}
79
+
80
+	public void start()
81
+	{
82
+		if (_task == null)
83
+		{
84
+			_task = ThreadPool.scheduleAtFixedRate(() -> executeRoutine(), 450, 450);
85
+			
86
+			player.sendPacket(new ExShowScreenMessage("Auto Farming Actived...", 5*1000, SMPOS.TOP_CENTER, false));
87
+			player.sendPacket(new SystemMessage(SystemMessageId.AUTO_FARM_ACTIVATED));
88
+		    
89
+		
90
+		}
91
+	}
92
+	
93
+	public void stop()
94
+	{
95
+		if (_task != null)
96
+		{
97
+			_task.cancel(false);
98
+			_task = null;
99
+			
100
+			player.sendPacket(new ExShowScreenMessage("Auto Farming Deactivated...", 5*1000, SMPOS.TOP_CENTER, false));
101
+			player.sendPacket(new SystemMessage(SystemMessageId.AUTO_FARM_DESACTIVATED));
102
+		   
103
+		}
104
+	}
105
+	
106
+	public void executeRoutine()
107
+	{
108
+		if (player.isNoBuffProtected() && player.getAllEffects().length <= 8)
109
+		{
110
+			player.sendMessage("You don't have buffs to use autofarm.");
111
+			player.broadcastUserInfo();
112
+			stop();	
113
+			player.setAutoFarm(false);
114
+			VoicedAutoFarm.showAutoFarm(player);
115
+			return;
116
+		}
117
+		
118
+		calculatePotions();
119
+		checkSpoil();
120
+		targetEligibleCreature();
121
+	    if (player.isMageClass()) 
122
+	    {
123
+	        useAppropriateSpell(); 
124
+	    }
125
+	    else if (shotcutsContainAttack())
126
+	    {
127
+	        attack(); 
128
+	    }
129
+	    else
130
+	    {
131
+	        useAppropriateSpell(); 
132
+	    }
133
+		checkSpoil();
134
+		useAppropriateSpell();
135
+	}
136
+
137
+	private void attack() 
138
+	{
139
+		Boolean shortcutsContainAttack = shotcutsContainAttack();
140
+		
141
+	    if (shortcutsContainAttack) 
142
+	        physicalAttack();
143
+	}
144
+
145
+	private void useAppropriateSpell() 
146
+	{
147
+		L2Skill chanceSkill = nextAvailableSkill(getChanceSpells(), AutofarmSpellType.Chance);
148
+
149
+		if (chanceSkill != null)
150
+		{
151
+			useMagicSkill(chanceSkill, false);
152
+			return;
153
+		}
154
+
155
+		L2Skill lowLifeSkill = nextAvailableSkill(getLowLifeSpells(), AutofarmSpellType.LowLife);
156
+
157
+		if (lowLifeSkill != null) 
158
+		{
159
+			useMagicSkill(lowLifeSkill, true);
160
+			return;
161
+		}
162
+
163
+		L2Skill attackSkill = nextAvailableSkill(getAttackSpells(), AutofarmSpellType.Attack);
164
+
165
+		if (attackSkill != null) 
166
+		{
167
+			useMagicSkill(attackSkill, false);
168
+			return;
169
+		}
170
+	}
171
+
172
+	public L2Skill nextAvailableSkill(List<Integer> skillIds, AutofarmSpellType spellType) 
173
+	{
174
+		for (Integer skillId : skillIds) 
175
+		{
176
+			L2Skill skill = player.getSkill(skillId);
177
+
178
+			if (skill == null) 
179
+				continue;
180
+			
181
+			if (skill.getSkillType() == L2SkillType.SIGNET || skill.getSkillType() == L2SkillType.SIGNET_CASTTIME)
182
+				continue;
183
+
184
+			if (!player.checkDoCastConditions(skill)) 
185
+				continue;
186
+
187
+			if (isSpoil(skillId))
188
+			{
189
+				if (monsterIsAlreadySpoiled())
190
+				{
191
+					continue;
192
+				}
193
+				return skill;
194
+			}
195
+			
196
+			if (spellType == AutofarmSpellType.Chance && getMonsterTarget() != null)
197
+			{
198
+				if (getMonsterTarget().getFirstEffect(skillId) == null) 
199
+					return skill;
200
+				continue;
201
+			}
202
+
203
+			if (spellType == AutofarmSpellType.LowLife && getHpPercentage() > player.getHealPercent()) 
204
+				break;
205
+
206
+			return skill;
207
+		}
208
+
209
+		return null;
210
+	}
211
+	
212
+	private void checkSpoil() 
213
+	{
214
+		if (canBeSweepedByMe() && getMonsterTarget().isDead()) 
215
+		{
216
+			L2Skill sweeper = player.getSkill(42);
217
+			if (sweeper == null) 
218
+				return;
219
+			
220
+			useMagicSkill(sweeper, false);
221
+		}
222
+	}
223
+
224
+	private Double getHpPercentage() 
225
+	{
226
+		return player.getCurrentHp() * 100.0f / player.getMaxHp();
227
+	}
228
+
229
+	private Double percentageMpIsLessThan() 
230
+	{
231
+		return player.getCurrentMp() * 100.0f / player.getMaxMp();
232
+	}
233
+
234
+	private Double percentageHpIsLessThan()
235
+	{
236
+		return player.getCurrentHp() * 100.0f / player.getMaxHp();
237
+	}
238
+
239
+	private List<Integer> getAttackSpells()
240
+	{
241
+		return getSpellsInSlots(AutofarmConstants.attackSlots);
242
+	}
243
+
244
+	private List<Integer> getSpellsInSlots(List<Integer> attackSlots) 
245
+	{
246
+		return Arrays.stream(player.getAllShortCuts()).filter(shortcut -> shortcut.getPage() == player.getPage() && shortcut.getType() == L2ShortCut.TYPE_SKILL && attackSlots.contains(shortcut.getSlot())).map(L2ShortCut::getId).collect(Collectors.toList());
247
+	}
248
+
249
+	private List<Integer> getChanceSpells()
250
+	{
251
+		return getSpellsInSlots(AutofarmConstants.chanceSlots);
252
+	}
253
+
254
+	private List<Integer> getLowLifeSpells()
255
+	{
256
+		return getSpellsInSlots(AutofarmConstants.lowLifeSlots);
257
+	}
258
+
259
+	private boolean shotcutsContainAttack() 
260
+	{
261
+		return Arrays.stream(player.getAllShortCuts()).anyMatch(shortcut -> shortcut.getPage() == player.getPage() && shortcut.getType() == L2ShortCut.TYPE_ACTION && (shortcut.getId() == 2 || player.isSummonAttack() && shortcut.getId() == 22));
262
+	}
263
+	
264
+	private boolean monsterIsAlreadySpoiled()
265
+	{
266
+		return getMonsterTarget() != null && getMonsterTarget().getSpoilerId() != 0;
267
+	}
268
+	
269
+	private static boolean isSpoil(Integer skillId)
270
+	{
271
+		return skillId == 254 || skillId == 302;
272
+	}
273
+	
274
+	private boolean canBeSweepedByMe() 
275
+	{
276
+	    return getMonsterTarget() != null && getMonsterTarget().isDead() && getMonsterTarget().getSpoilerId() == player.getObjectId();
277
+	}
278
+	
279
+	private void castSpellWithAppropriateTarget(L2Skill skill, Boolean forceOnSelf)
280
+	{
281
+		if (forceOnSelf) 
282
+		{
283
+			WorldObject oldTarget = player.getTarget();
284
+			player.setTarget(player);
285
+			player.useMagic(skill, false, false);
286
+			player.setTarget(oldTarget);
287
+			return;
288
+		}
289
+
290
+		player.useMagic(skill, false, false);
291
+	}
292
+
293
+	private void physicalAttack()
294
+	{
295
+	    if (!(player.getTarget() instanceof Monster)) 
296
+	        return;
297
+
298
+	    Monster target = (Monster) player.getTarget();
299
+
300
+	    if (!player.isMageClass()) 
301
+	    {
302
+	        if (target.isAutoAttackable(player) && GeoEngine.getInstance().canSeeTarget(player, target))
303
+	        {
304
+	            if (GeoEngine.getInstance().canSeeTarget(player, target))
305
+	            {
306
+	                player.getAI().setIntention(CtrlIntention.ATTACK, target);
307
+	                player.onActionRequest();
308
+
309
+	                if (player.isSummonAttack() && player.getPet() != null)
310
+	                {
311
+	                    // Siege Golem's
312
+	                    if (player.getPet().getNpcId() >= 14702 && player.getPet().getNpcId() <= 14798 || player.getPet().getNpcId() >= 14839 && player.getPet().getNpcId() <= 14869)
313
+	                        return;
314
+
315
+	                    Summon activeSummon = player.getPet();
316
+	                    activeSummon.setTarget(target);
317
+	                    activeSummon.getAI().setIntention(CtrlIntention.ATTACK, target);
318
+
319
+	                    int[] summonAttackSkills = {4261, 4068, 4137, 4260, 4708, 4709, 4710, 4712, 5135, 5138, 5141, 5442, 5444, 6095, 6096, 6041, 6044};
320
+	                    if (Rnd.get(100) < player.getSummonSkillPercent())
321
+	                    {
322
+	                        for (int skillId : summonAttackSkills)
323
+	                        {
324
+	                            useMagicSkillBySummon(skillId, target);
325
+	                        }
326
+	                    }
327
+	                }
328
+	            }
329
+	        }
330
+	        else
331
+	        {
332
+	            if (target.isAutoAttackable(player) && GeoEngine.getInstance().canSeeTarget(player, target))
333
+	            if (GeoEngine.getInstance().canSeeTarget(player, target))
334
+	                player.getAI().setIntention(CtrlIntention.FOLLOW, target);
335
+	        }
336
+	    }
337
+	    else
338
+	    {
339
+	        if (player.isSummonAttack() && player.getPet() != null)
340
+	        {
341
+	            // Siege Golem's
342
+	            if (player.getPet().getNpcId() >= 14702 && player.getPet().getNpcId() <= 14798 || player.getPet().getNpcId() >= 14839 && player.getPet().getNpcId() <= 14869)
343
+	                return;
344
+
345
+	            Summon activeSummon = player.getPet();
346
+	            activeSummon.setTarget(target);
347
+	            activeSummon.getAI().setIntention(CtrlIntention.ATTACK, target);
348
+
349
+	            int[] summonAttackSkills = {4261, 4068, 4137, 4260, 4708, 4709, 4710, 4712, 5135, 5138, 5141, 5442, 5444, 6095, 6096, 6041, 6044};
350
+	            if (Rnd.get(100) < player.getSummonSkillPercent())
351
+	            {
352
+	                for (int skillId : summonAttackSkills)
353
+	                {
354
+	                    useMagicSkillBySummon(skillId, target);
355
+	                }
356
+	            }
357
+	        }
358
+	    }
359
+	}
360
+
361
+
362
+	public void targetEligibleCreature() {
363
+	    if (player.getTarget() == null) {
364
+	        selectNewTarget(); 
365
+	        return;
366
+	    }
367
+
368
+	    if (committedTarget != null) {
369
+	      if (!committedTarget.isDead() && GeoEngine.getInstance().canSeeTarget(player, committedTarget)) {
370
+	            attack();
371
+	            return;
372
+	        } else if (!GeoEngine.getInstance().canSeeTarget(player, committedTarget)) {
373
+	            committedTarget = null;
374
+	            selectNewTarget(); 
375
+	            return;
376
+	        }
377
+	        player.getAI().setIntention(CtrlIntention.FOLLOW, committedTarget);
378
+	        committedTarget = null;
379
+	        player.setTarget(null);
380
+	    }
381
+	    
382
+	    if (committedTarget instanceof Summon) 
383
+	        return;
384
+	        
385
+	    List<Monster> targets = getKnownMonstersInRadius(player, player.getRadius(), creature -> GeoEngine.getInstance().canMoveToTarget(player.getX(), player.getY(), player.getZ(), creature.getX(), creature.getY(), creature.getZ()) && !player.ignoredMonsterContain(creature.getNpcId()) && !creature.isRaidMinion() && !creature.isRaid() && !creature.isDead() && !(creature instanceof Chest) && !(player.isAntiKsProtected() && creature.getTarget() != null && creature.getTarget() != player && creature.getTarget() != player.getPet()) );
386
+
387
+	    if (targets.isEmpty())
388
+	        return;
389
+
390
+	    Monster closestTarget = targets.stream().min((o1, o2) -> Integer.compare((int) Math.sqrt(player.getDistanceSq(o1)), (int) Math.sqrt(player.getDistanceSq(o2)))).get();
391
+
392
+	    committedTarget = closestTarget;
393
+	    player.setTarget(closestTarget);
394
+	}
395
+
396
+
397
+	
398
+
399
+
400
+	
401
+	private void selectNewTarget() 
402
+	{
403
+	    List<Monster> targets = getKnownMonstersInRadius(player, player.getRadius(), creature -> GeoEngine.getInstance().canMoveToTarget(player.getX(), player.getY(), player.getZ(), creature.getX(), creature.getY(), creature.getZ()) && !player.ignoredMonsterContain(creature.getNpcId()) && !creature.isRaidMinion() && !creature.isRaid() && !creature.isDead() && !(creature instanceof Chest) && !(player.isAntiKsProtected() && creature.getTarget() != null && creature.getTarget() != player && creature.getTarget() != player.getPet()) );
404
+
405
+	    if (targets.isEmpty())
406
+	        return;
407
+
408
+	    Monster closestTarget = targets.stream().min((o1, o2) -> Integer.compare((int) Math.sqrt(player.getDistanceSq(o1)), (int) Math.sqrt(player.getDistanceSq(o2)))).get();
409
+
410
+	    committedTarget = closestTarget;
411
+	    player.setTarget(closestTarget);
412
+	}
413
+
414
+
415
+
416
+
417
+	public final static List<Monster> getKnownMonstersInRadius(Player player, int radius, Function<Monster, Boolean> condition)
418
+	{
419
+		final WorldRegion region = player.getRegion();
420
+		if (region == null)
421
+			return Collections.emptyList();
422
+
423
+		final List<Monster> result = new ArrayList<>();
424
+
425
+		for (WorldRegion reg : region.getSurroundingRegions())
426
+		{
427
+			for (WorldObject obj : reg.getObjects())
428
+			{
429
+				if (!(obj instanceof Monster) || !MathUtil.checkIfInRange(radius, player, obj, true) || !condition.apply((Monster) obj))
430
+					continue;
431
+
432
+				result.add((Monster) obj);
433
+			}
434
+		}
435
+
436
+		return result;
437
+	}
438
+
439
+	public Monster getMonsterTarget()
440
+	{
441
+		if(!(player.getTarget() instanceof Monster)) 
442
+		{
443
+			return null;
444
+		}
445
+
446
+		return (Monster)player.getTarget();
447
+	}
448
+
449
+	private void useMagicSkill(L2Skill skill, Boolean forceOnSelf)
450
+	{
451
+		if (skill.getSkillType() == L2SkillType.RECALL && !Config.KARMA_PLAYER_CAN_TELEPORT && player.getKarma() > 0)
452
+		{
453
+			player.sendPacket(ActionFailed.STATIC_PACKET);
454
+			return;
455
+		}
456
+
457
+		if (skill.isToggle() && player.isMounted())
458
+		{
459
+			player.sendPacket(ActionFailed.STATIC_PACKET);
460
+			return;
461
+		}
462
+
463
+		if (player.isOutOfControl())
464
+		{
465
+			player.sendPacket(ActionFailed.STATIC_PACKET);
466
+			return;
467
+		}
468
+
469
+		if (player.isAttackingNow())
470
+			player.getAI().setNextAction(new NextAction(CtrlEvent.EVT_READY_TO_ACT, CtrlIntention.CAST, () -> castSpellWithAppropriateTarget(skill, forceOnSelf)));
471
+		else 
472
+			castSpellWithAppropriateTarget(skill, forceOnSelf);
473
+	}
474
+	
475
+	private boolean useMagicSkillBySummon(int skillId, WorldObject target)
476
+	{
477
+		// No owner, or owner in shop mode.
478
+		if (player == null || player.isInStoreMode())
479
+			return false;
480
+		
481
+		final Summon activeSummon = player.getPet();
482
+		if (activeSummon == null)
483
+			return false;
484
+		
485
+		// Pet which is 20 levels higher than owner.
486
+		if (activeSummon instanceof Pet && activeSummon.getLevel() - player.getLevel() > 20)
487
+		{
488
+			player.sendPacket(SystemMessageId.PET_TOO_HIGH_TO_CONTROL);
489
+			return false;
490
+		}
491
+		
492
+		// Out of control pet.
493
+		if (activeSummon.isOutOfControl())
494
+		{
495
+			player.sendPacket(SystemMessageId.PET_REFUSING_ORDER);
496
+			return false;
497
+		}
498
+		
499
+		// Verify if the launched skill is mastered by the summon.
500
+		final L2Skill skill = activeSummon.getSkill(skillId);
501
+		if (skill == null)
502
+			return false;
503
+		
504
+		// Can't launch offensive skills on owner.
505
+		if (skill.isOffensive() && player == target)
506
+			return false;
507
+		
508
+		activeSummon.setTarget(target);
509
+		return activeSummon.useMagic(skill, false, false);
510
+	}
511
+
512
+	private void calculatePotions()
513
+	{
514
+		if (percentageHpIsLessThan() < player.getHpPotionPercentage())
515
+			forceUseItem(1539); 
516
+
517
+		if (percentageMpIsLessThan() < player.getMpPotionPercentage())
518
+			forceUseItem(728); 
519
+	}	
520
+
521
+	private void forceUseItem(int itemId)
522
+	{
523
+		final ItemInstance potion = player.getInventory().getItemByItemId(itemId);
524
+		if (potion == null)
525
+			return; 
526
+
527
+		final IItemHandler handler = ItemHandler.getInstance().getItemHandler(potion.getEtcItem());
528
+		if (handler != null)
529
+			handler.useItem(player, potion, false); 
530
+	}	
531
+}
532
\ No newline at end of file
533
diff --git java/Base/AutoFarm/AutofarmSpell.java java/Base/AutoFarm/AutofarmSpell.java
534
new file mode 100644
535
index 0000000..beefc8d
536
--- /dev/null
537
+++ java/Base/AutoFarm/AutofarmSpell.java
538
@@ -0,0 +1,20 @@
539
+package Base.AutoFarm;
540
+
541
+public class AutofarmSpell {
542
+	private final Integer _skillId;
543
+	private final AutofarmSpellType _spellType;
544
+	
545
+	public AutofarmSpell(Integer skillId, AutofarmSpellType spellType){
546
+		
547
+		_skillId = skillId;
548
+		_spellType = spellType;
549
+	}
550
+	
551
+	public Integer getSkillId() {
552
+		return _skillId;
553
+	}
554
+	
555
+	public AutofarmSpellType getSpellType() {
556
+		return _spellType;
557
+	}
558
+}
559
\ No newline at end of file
560
diff --git java/Base/AutoFarm/AutofarmSpellType.java java/Base/AutoFarm/AutofarmSpellType.java
561
new file mode 100644
562
index 0000000..2ec3039
563
--- /dev/null
564
+++ java/Base/AutoFarm/AutofarmSpellType.java
565
@@ -0,0 +1,8 @@
566
+package Base.AutoFarm;
567
+
568
+public enum AutofarmSpellType
569
+{
570
+    Attack,
571
+    Chance,
572
+    LowLife    
573
+}
574
\ No newline at end of file
575
diff --git java/com/l2jmega/gameserver/handler/VoicedCommandHandler.java java/com/l2jmega/gameserver/handler/VoicedCommandHandler.java
576
index 7532a04..8463819 100644
577
--- java/com/l2jmega/gameserver/handler/VoicedCommandHandler.java
578
+++ java/com/l2jmega/gameserver/handler/VoicedCommandHandler.java
579
@@ -17,6 +17,7 @@
580
 import java.util.HashMap;
581
 import java.util.Map;
582
 
583
+import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedAutoFarm;
584
 import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedAutoPotion;
585
 import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedBanking;
586
 import com.l2jmega.gameserver.handler.voicedcommandhandlers.VoicedBossSpawn;
587
@@ -52,6 +53,7 @@
588
 		registerHandler(new VoicedAutoPotion());
589
 		registerHandler(new VoicedPassword());
590
 		registerHandler(new VoicedEnchant());
591
+		registerHandler(new VoicedAutoFarm());
592
 		
593
 		registerHandler(new VoicedTrySkin());
594
 		registerHandler(new VoicedRanking());
595
diff --git java/com/l2jmega/gameserver/handler/voicedcommandhandlers/VoicedAutoFarm.java java/com/l2jmega/gameserver/handler/voicedcommandhandlers/VoicedAutoFarm.java
596
new file mode 100644
597
index 0000000..a2c1c4a
598
--- /dev/null
599
+++ java/com/l2jmega/gameserver/handler/voicedcommandhandlers/VoicedAutoFarm.java
600
@@ -0,0 +1,325 @@
601
+package com.l2jmega.gameserver.handler.voicedcommandhandlers;
602
+
603
+import com.l2jmega.gameserver.handler.IVoicedCommandHandler;
604
+import com.l2jmega.gameserver.model.WorldObject;
605
+import com.l2jmega.gameserver.model.actor.instance.Monster;
606
+import com.l2jmega.gameserver.model.actor.instance.Player;
607
+import com.l2jmega.gameserver.network.SystemMessageId;
608
+import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage;
609
+import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
610
+import com.l2jmega.gameserver.network.serverpackets.NpcHtmlMessage;
611
+import com.l2jmega.gameserver.network.serverpackets.SystemMessage;
612
+
613
+import java.util.StringTokenizer;
614
+
615
+import com.l2jmega.commons.lang.StringUtil;
616
+
617
+import Base.AutoFarm.AutofarmPlayerRoutine;
618
+
619
+
620
+
621
+
622
+
623
+public class VoicedAutoFarm implements IVoicedCommandHandler 
624
+{
625
+    private final String[] VOICED_COMMANDS = 
626
+    {
627
+    	"autofarm",
628
+    	"enableAutoFarm",
629
+    	"radiusAutoFarm",
630
+    	"pageAutoFarm",
631
+    	"enableBuffProtect",
632
+    	"healAutoFarm",
633
+    	"hpAutoFarm",
634
+    	"mpAutoFarm",
635
+    	"enableAntiKs",
636
+    	"enableSummonAttack",
637
+    	"summonSkillAutoFarm",
638
+    	"ignoreMonster",
639
+    	"activeMonster"
640
+   };
641
+
642
+    @Override
643
+    public boolean useVoicedCommand(final String command, final Player activeChar, final String args)
644
+   {
645
+		final AutofarmPlayerRoutine bot = activeChar.getBot();
646
+		
647
+    	if (command.startsWith("autofarm"))
648
+    		showAutoFarm(activeChar);
649
+   	
650
+		if (command.startsWith("radiusAutoFarm"))
651
+		{
652
+			StringTokenizer st = new StringTokenizer(command, " ");
653
+			st.nextToken();
654
+			try
655
+			{
656
+				String param = st.nextToken();
657
+
658
+				if (param.startsWith("inc_radius"))
659
+				{
660
+					activeChar.setRadius(activeChar.getRadius() + 200);
661
+					showAutoFarm(activeChar);
662
+				}
663
+				else if (param.startsWith("dec_radius"))
664
+				{
665
+					activeChar.setRadius(activeChar.getRadius() - 200);
666
+					showAutoFarm(activeChar);
667
+				}
668
+				activeChar.saveAutoFarmSettings();
669
+			}
670
+			catch (Exception e)
671
+			{
672
+				e.printStackTrace();
673
+			}
674
+		}
675
+		
676
+		if (command.startsWith("pageAutoFarm"))
677
+		{
678
+			StringTokenizer st = new StringTokenizer(command, " ");
679
+			st.nextToken();
680
+			try
681
+			{
682
+				String param = st.nextToken();
683
+
684
+				if (param.startsWith("inc_page"))
685
+				{
686
+					activeChar.setPage(activeChar.getPage() + 1);
687
+					showAutoFarm(activeChar);
688
+				}
689
+				else if (param.startsWith("dec_page"))
690
+				{
691
+					activeChar.setPage(activeChar.getPage() - 1);
692
+					showAutoFarm(activeChar);
693
+				}
694
+				activeChar.saveAutoFarmSettings();
695
+			}
696
+			catch (Exception e)
697
+			{
698
+				e.printStackTrace();
699
+			}
700
+		}
701
+		
702
+		if (command.startsWith("healAutoFarm"))
703
+		{
704
+			StringTokenizer st = new StringTokenizer(command, " ");
705
+			st.nextToken();
706
+			try
707
+			{
708
+				String param = st.nextToken();
709
+
710
+				if (param.startsWith("inc_heal"))
711
+				{
712
+					activeChar.setHealPercent(activeChar.getHealPercent() + 10);
713
+					showAutoFarm(activeChar);
714
+				}
715
+				else if (param.startsWith("dec_heal"))
716
+				{
717
+					activeChar.setHealPercent(activeChar.getHealPercent() - 10);
718
+					showAutoFarm(activeChar);
719
+				}
720
+				activeChar.saveAutoFarmSettings();
721
+			}
722
+			catch (Exception e)
723
+			{
724
+				e.printStackTrace();
725
+			}
726
+		}
727
+		
728
+		if (command.startsWith("hpAutoFarm"))
729
+		{
730
+			StringTokenizer st = new StringTokenizer(command, " ");
731
+			st.nextToken();
732
+			try
733
+			{
734
+				String param = st.nextToken();
735
+
736
+				if (param.contains("inc_hp_pot"))
737
+				{
738
+					activeChar.setHpPotionPercentage(activeChar.getHpPotionPercentage() + 5);
739
+					showAutoFarm(activeChar);
740
+				}
741
+				else if (param.contains("dec_hp_pot"))
742
+				{
743
+					activeChar.setHpPotionPercentage(activeChar.getHpPotionPercentage() - 5);
744
+					showAutoFarm(activeChar);
745
+				}
746
+				activeChar.saveAutoFarmSettings();
747
+			}
748
+			catch (Exception e)
749
+			{
750
+				e.printStackTrace();
751
+			}
752
+		}
753
+		
754
+		if (command.startsWith("mpAutoFarm"))
755
+		{
756
+			StringTokenizer st = new StringTokenizer(command, " ");
757
+			st.nextToken();
758
+			try
759
+			{
760
+				String param = st.nextToken();
761
+
762
+				if (param.contains("inc_mp_pot"))
763
+				{
764
+					activeChar.setMpPotionPercentage(activeChar.getMpPotionPercentage() + 5);
765
+					showAutoFarm(activeChar);
766
+				}
767
+				else if (param.contains("dec_mp_pot"))
768
+				{
769
+					activeChar.setMpPotionPercentage(activeChar.getMpPotionPercentage() - 5);
770
+					showAutoFarm(activeChar);
771
+				}
772
+				activeChar.saveAutoFarmSettings();
773
+			}
774
+			catch (Exception e)
775
+			{
776
+				e.printStackTrace();
777
+			}
778
+		}
779
+		
780
+		if (command.startsWith("enableAutoFarm"))
781
+		{
782
+	    	if (activeChar.isAutoFarm())
783
+	    	{
784
+	    		bot.stop();
785
+				activeChar.setAutoFarm(false);
786
+	    	}
787
+	    	else
788
+	    	{
789
+	    		bot.start();
790
+				activeChar.setAutoFarm(true);
791
+	    	}
792
+
793
+	    	showAutoFarm(activeChar);
794
+		}
795
+		
796
+		if (command.startsWith("enableBuffProtect"))
797
+		{
798
+			activeChar.setNoBuffProtection(!activeChar.isNoBuffProtected());
799
+			showAutoFarm(activeChar);
800
+			activeChar.saveAutoFarmSettings();
801
+		}
802
+		
803
+		if (command.startsWith("enableAntiKs"))
804
+		{
805
+			activeChar.setAntiKsProtection(!activeChar.isAntiKsProtected());
806
+			
807
+			if(activeChar.isAntiKsProtected()) {
808
+				activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_RESPECT_HUNT));
809
+				activeChar.sendPacket(new ExShowScreenMessage("Respct Hunt On" , 3*1000, SMPOS.TOP_CENTER, false));
810
+			}else {
811
+				activeChar.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_RESPECT_HUNT));
812
+				activeChar.sendPacket(new ExShowScreenMessage("Respct Hunt Off" , 3*1000, SMPOS.TOP_CENTER, false));
813
+			}
814
+			
815
+			activeChar.saveAutoFarmSettings();
816
+			showAutoFarm(activeChar);
817
+		}
818
+		
819
+		if (command.startsWith("enableSummonAttack"))
820
+		{
821
+			activeChar.setSummonAttack(!activeChar.isSummonAttack());
822
+			if(activeChar.isSummonAttack()) {
823
+				activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
824
+				activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack On" , 3*1000, SMPOS.TOP_CENTER, false));
825
+			}else {
826
+				activeChar.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_SUMMON_ACTACK));
827
+				activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack Off" , 3*1000, SMPOS.TOP_CENTER, false));
828
+			}
829
+			activeChar.saveAutoFarmSettings();
830
+			showAutoFarm(activeChar);
831
+		}
832
+		
833
+		if (command.startsWith("summonSkillAutoFarm"))
834
+		{
835
+			StringTokenizer st = new StringTokenizer(command, " ");
836
+			st.nextToken();
837
+			try
838
+			{
839
+				String param = st.nextToken();
840
+
841
+				if (param.startsWith("inc_summonSkill"))
842
+				{
843
+					activeChar.setSummonSkillPercent(activeChar.getSummonSkillPercent() + 10);
844
+					showAutoFarm(activeChar);
845
+				}
846
+				else if (param.startsWith("dec_summonSkill"))
847
+				{
848
+					activeChar.setSummonSkillPercent(activeChar.getSummonSkillPercent() - 10);
849
+					showAutoFarm(activeChar);
850
+				}
851
+				activeChar.saveAutoFarmSettings();
852
+			}
853
+			catch (Exception e)
854
+			{
855
+				e.printStackTrace();
856
+			}
857
+		}
858
+		
859
+		if (command.startsWith("ignoreMonster"))
860
+		{
861
+			int monsterId = 0;
862
+			WorldObject target = activeChar.getTarget();
863
+			if (target instanceof Monster)
864
+				monsterId = ((Monster) target).getNpcId();
865
+			
866
+			if (target == null)
867
+			{
868
+				activeChar.sendMessage("You dont have a target");
869
+				return false;
870
+			}
871
+			
872
+			activeChar.sendMessage(target.getName() + " has been added to the ignore list.");
873
+			activeChar.ignoredMonster(monsterId);
874
+		}
875
+		
876
+		if (command.startsWith("activeMonster"))
877
+		{
878
+			int monsterId = 0;
879
+			WorldObject target = activeChar.getTarget();
880
+			if (target instanceof Monster)
881
+				monsterId = ((Monster) target).getNpcId();
882
+			
883
+			if (target == null)
884
+			{
885
+				activeChar.sendMessage("You dont have a target");
886
+				return false;
887
+			}
888
+			
889
+			activeChar.sendMessage(target.getName() + " has been removed from the ignore list.");
890
+			activeChar.activeMonster(monsterId);
891
+		}
892
+		
893
+        return false;
894
+    }
895
+   
896
+	private static final String ACTIVED = "<font color=00FF00>STARTED</font>";
897
+	private static final String DESATIVED = "<font color=FF0000>STOPPED</font>";
898
+	private static final String STOP = "STOP";
899
+	private static final String START = "START";
900
+	
901
+	public static void showAutoFarm(Player activeChar)
902
+	{
903
+		NpcHtmlMessage html = new NpcHtmlMessage(0);
904
+		html.setFile("data/html/mods/menu/AutoFarm.htm"); 
905
+		html.replace("%player%", activeChar.getName());
906
+		html.replace("%page%", StringUtil.formatNumber(activeChar.getPage() + 1));
907
+		html.replace("%heal%", StringUtil.formatNumber(activeChar.getHealPercent()));
908
+		html.replace("%radius%", StringUtil.formatNumber(activeChar.getRadius()));
909
+		html.replace("%summonSkill%", StringUtil.formatNumber(activeChar.getSummonSkillPercent()));
910
+		html.replace("%hpPotion%", StringUtil.formatNumber(activeChar.getHpPotionPercentage()));
911
+		html.replace("%mpPotion%", StringUtil.formatNumber(activeChar.getMpPotionPercentage()));
912
+		html.replace("%noBuff%", activeChar.isNoBuffProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
913
+		html.replace("%summonAtk%", activeChar.isSummonAttack() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
914
+		html.replace("%antiKs%", activeChar.isAntiKsProtected() ? "back=L2UI.CheckBox_checked fore=L2UI.CheckBox_checked" : "back=L2UI.CheckBox fore=L2UI.CheckBox");
915
+		html.replace("%autofarm%", activeChar.isAutoFarm() ? ACTIVED : DESATIVED);
916
+		html.replace("%button%", activeChar.isAutoFarm() ? STOP : START);
917
+		activeChar.sendPacket(html);
918
+	}
919
+
920
+    @Override
921
+    public String[] getVoicedCommandList() 
922
+    {
923
+        return VOICED_COMMANDS;
924
+    }
925
+}
926
\ No newline at end of file
927
diff --git java/com/l2jmega/gameserver/model/actor/instance/Gatekeeper.java java/com/l2jmega/gameserver/model/actor/instance/Gatekeeper.java
928
index 8a667a8..ec52f89 100644
929
--- java/com/l2jmega/gameserver/model/actor/instance/Gatekeeper.java
930
+++ java/com/l2jmega/gameserver/model/actor/instance/Gatekeeper.java
931
@@ -7,6 +7,8 @@
932
 import com.l2jmega.commons.math.MathUtil;
933
 import com.l2jmega.commons.random.Rnd;
934
 
935
+import Base.AutoFarm.AutofarmPlayerRoutine;
936
+
937
 import com.l2jmega.Config;
938
 import com.l2jmega.events.ArenaTask;
939
 import com.l2jmega.gameserver.data.SpawnTable;
940
@@ -22,6 +24,7 @@
941
 import com.l2jmega.gameserver.network.SystemMessageId;
942
 import com.l2jmega.gameserver.network.serverpackets.ActionFailed;
943
 import com.l2jmega.gameserver.network.serverpackets.NpcHtmlMessage;
944
+import com.l2jmega.gameserver.network.serverpackets.SystemMessage;
945
 
946
 public final class Gatekeeper extends Folk
947
 {
948
@@ -48,6 +51,8 @@
949
 			player.sendMessage("You can not do that!");
950
 			return;
951
 		}
952
+		final AutofarmPlayerRoutine bot = player.getBot();
953
+		
954
 		
955
 		if (player.isArenaProtection())
956
 		{
957
@@ -1250,6 +1255,15 @@
958
 				
959
 				if (player.destroyItemByItemId("Teleport ", (list.isNoble()) ? 6651 : 57, price, this, true))
960
 					player.teleToLocation(list, 100);
961
+				player.sendPacket(new SystemMessage(SystemMessageId.WILL_BE_MOVED_INTERFACE));
962
+			
963
+			
964
+			if (player.isAutoFarm())
965
+			{
966
+				bot.stop();
967
+				player.setAutoFarm(false);
968
+			}
969
+				
970
 				
971
 				player.sendPacket(ActionFailed.STATIC_PACKET);
972
 			}
973
diff --git java/com/l2jmega/gameserver/model/actor/instance/Player.java java/com/l2jmega/gameserver/model/actor/instance/Player.java
974
index 845f9c1..2921ce9 100644
975
--- java/com/l2jmega/gameserver/model/actor/instance/Player.java
976
+++ java/com/l2jmega/gameserver/model/actor/instance/Player.java
977
@@ -269,6 +269,7 @@
978
 import com.l2jmega.commons.math.MathUtil;
979
 import com.l2jmega.commons.random.Rnd;
980
 
981
+import Base.AutoFarm.AutofarmPlayerRoutine;
982
 import phantom.Phantom_Archers;
983
 import phantom.Phantom_Attack;
984
 import phantom.Phantom_Farm;
985
@@ -10285,6 +10286,10 @@
986
 	@Override
987
 	public void deleteMe()
988
 	{
989
+		
990
+				
991
+				_bot.stop();
992
+				
993
 		cleanup();
994
 		store();
995
 		super.deleteMe();
996
@@ -10337,6 +10342,8 @@
997
 			// Remove the Player from the world
998
 			decayMe();
999
 			
1000
+						_bot.stop();
1001
+			
1002
 			// If a party is in progress, leave it
1003
 			if (isInParty())
1004
 				leaveParty();
1005
@@ -14469,4 +14476,220 @@
1006
 	{
1007
 		_dressMe = val;
1008
 	}
1009
+	
1010
+	// ------------
1011
+	// Autofarm
1012
+	// ------------
1013
+
1014
+	private boolean _autoFarm;
1015
+	
1016
+	public void setAutoFarm(boolean comm)
1017
+	{
1018
+		_autoFarm = comm;
1019
+	}
1020
+
1021
+	public boolean isAutoFarm()
1022
+	{
1023
+		return _autoFarm;
1024
+	}
1025
+	
1026
+	private int autoFarmRadius = 1200;
1027
+	
1028
+	public void setRadius(int value) 
1029
+	{
1030
+		autoFarmRadius = MathUtil.limit(value, 200, 3000);
1031
+	}
1032
+	
1033
+	public int getRadius()
1034
+	{
1035
+		return autoFarmRadius;
1036
+	}
1037
+	
1038
+	private int autoFarmShortCut = 9;
1039
+	
1040
+	public void setPage(int value) 
1041
+	{
1042
+		autoFarmShortCut = MathUtil.limit(value, 0, 9);
1043
+	}
1044
+	
1045
+	public int getPage()
1046
+	{
1047
+		return autoFarmShortCut;
1048
+	}
1049
+	
1050
+	private int autoFarmHealPercente = 30;
1051
+	
1052
+	public void setHealPercent(int value) 
1053
+	{
1054
+		autoFarmHealPercente = MathUtil.limit(value, 20, 90);
1055
+	}
1056
+	
1057
+	public int getHealPercent()
1058
+	{
1059
+		return autoFarmHealPercente;
1060
+	}
1061
+	
1062
+	private boolean autoFarmBuffProtection = false;
1063
+	
1064
+	public void setNoBuffProtection(boolean val) 
1065
+	{
1066
+		autoFarmBuffProtection = val;
1067
+	}
1068
+	
1069
+	public boolean isNoBuffProtected()
1070
+	{
1071
+		return autoFarmBuffProtection;
1072
+	}
1073
+	
1074
+	private boolean autoAntiKsProtection = false;
1075
+	
1076
+	public void setAntiKsProtection(boolean val) 
1077
+	{
1078
+		autoAntiKsProtection = val;
1079
+	}
1080
+	
1081
+	public boolean isAntiKsProtected()
1082
+	{
1083
+		return autoAntiKsProtection;
1084
+	}
1085
+	
1086
+	private boolean autoFarmSummonAttack = false;
1087
+	
1088
+	public void setSummonAttack(boolean val) 
1089
+	{
1090
+		autoFarmSummonAttack = val;
1091
+	}
1092
+	
1093
+	public boolean isSummonAttack()
1094
+	{
1095
+		return autoFarmSummonAttack;
1096
+	}
1097
+	
1098
+	private int autoFarmSummonSkillPercente = 0;
1099
+	
1100
+	public void setSummonSkillPercent(int value) 
1101
+	{
1102
+		autoFarmSummonSkillPercente = MathUtil.limit(value, 0, 90);
1103
+	}
1104
+	
1105
+	public int getSummonSkillPercent()
1106
+	{
1107
+		return autoFarmSummonSkillPercente;
1108
+	}
1109
+
1110
+	private int hpPotionPercent = 60;
1111
+	private int mpPotionPercent = 60;
1112
+
1113
+	public void setHpPotionPercentage(int value)
1114
+	{
1115
+		hpPotionPercent = MathUtil.limit(value, 0, 100);
1116
+	}
1117
+
1118
+	public int getHpPotionPercentage() 
1119
+	{
1120
+		return hpPotionPercent;
1121
+	}
1122
+
1123
+	public void setMpPotionPercentage(int value) 
1124
+	{
1125
+		mpPotionPercent = MathUtil.limit(value, 0, 100);
1126
+	}
1127
+
1128
+	public int getMpPotionPercentage()
1129
+	{
1130
+		return mpPotionPercent;
1131
+	}
1132
+
1133
+	private List<Integer> _ignoredMonster = new ArrayList<>();
1134
+
1135
+	public void ignoredMonster(Integer npcId)
1136
+	{
1137
+		_ignoredMonster.add(npcId);
1138
+	}
1139
+
1140
+	public void activeMonster(Integer npcId)
1141
+	{
1142
+		if (_ignoredMonster.contains(npcId))
1143
+			_ignoredMonster.remove(npcId);
1144
+	}
1145
+
1146
+	public boolean ignoredMonsterContain(int npcId)
1147
+	{
1148
+		return _ignoredMonster.contains(npcId);
1149
+	}
1150
+
1151
+	private AutofarmPlayerRoutine _bot = new AutofarmPlayerRoutine(this);
1152
+	
1153
+	public AutofarmPlayerRoutine getBot()
1154
+	{
1155
+		if (_bot == null)
1156
+			_bot = new AutofarmPlayerRoutine(this);
1157
+		
1158
+		return _bot;
1159
+	}
1160
+	
1161
+	
1162
+    
1163
+    public void saveAutoFarmSettings() {
1164
+        try (Connection con = L2DatabaseFactory.getInstance().getConnection()) {
1165
+            String updateSql = "REPLACE INTO character_autofarm (char_id, char_name,  radius, short_cut, heal_percent, buff_protection, anti_ks_protection, summon_attack, summon_skill_percent, hp_potion_percent, mp_potion_percent) VALUES (?, ?, ?,  ?, ?, ?, ?, ?, ?, ?, ?)";
1166
+            try (PreparedStatement updateStatement = con.prepareStatement(updateSql)) {
1167
+                updateStatement.setInt(1, getObjectId()); // char_id
1168
+                updateStatement.setString(2, getName()); // char_name
1169
+               
1170
+                updateStatement.setInt(3, autoFarmRadius);
1171
+                updateStatement.setInt(4, autoFarmShortCut);
1172
+                updateStatement.setInt(5, autoFarmHealPercente);
1173
+                updateStatement.setBoolean(6, autoFarmBuffProtection);
1174
+                updateStatement.setBoolean(7, autoAntiKsProtection);
1175
+                updateStatement.setBoolean(8, autoFarmSummonAttack);
1176
+                updateStatement.setInt(9, autoFarmSummonSkillPercente);
1177
+                updateStatement.setInt(10, hpPotionPercent);
1178
+                updateStatement.setInt(11, mpPotionPercent);
1179
+                updateStatement.executeUpdate();
1180
+            }
1181
+        } catch (SQLException e) {
1182
+            e.printStackTrace();
1183
+        }
1184
+    }
1185
+
1186
+    public void loadAutoFarmSettings() {
1187
+        try (Connection con = L2DatabaseFactory.getInstance().getConnection()) {
1188
+            String selectSql = "SELECT * FROM character_autofarm WHERE char_id = ?";
1189
+            try (PreparedStatement selectStatement = con.prepareStatement(selectSql)) {
1190
+                selectStatement.setInt(1, getObjectId()); // char_id
1191
+                try (ResultSet resultSet = selectStatement.executeQuery()) {
1192
+                    if (resultSet.next()) {
1193
+                       
1194
+                        autoFarmRadius = resultSet.getInt("radius");
1195
+                        autoFarmShortCut = resultSet.getInt("short_cut");
1196
+                        autoFarmHealPercente = resultSet.getInt("heal_percent");
1197
+                        autoFarmBuffProtection = resultSet.getBoolean("buff_protection");
1198
+                        autoAntiKsProtection = resultSet.getBoolean("anti_ks_protection");
1199
+                        autoFarmSummonAttack = resultSet.getBoolean("summon_attack");
1200
+                        autoFarmSummonSkillPercente = resultSet.getInt("summon_skill_percent");
1201
+                        hpPotionPercent = resultSet.getInt("hp_potion_percent");
1202
+                        mpPotionPercent = resultSet.getInt("mp_potion_percent");
1203
+                    } else {
1204
+                        
1205
+                      
1206
+                        autoFarmRadius = 1200;
1207
+                        autoFarmShortCut = 9;
1208
+                        autoFarmHealPercente = 30;
1209
+                        autoFarmBuffProtection = false;
1210
+                        autoAntiKsProtection = false;
1211
+                        autoFarmSummonAttack = false;
1212
+                        autoFarmSummonSkillPercente = 0;
1213
+                        hpPotionPercent = 60;
1214
+                        mpPotionPercent = 60;
1215
+                    }
1216
+                }
1217
+            }
1218
+        } catch (SQLException e) {
1219
+            e.printStackTrace();
1220
+        }
1221
+    }
1222
+	
1223
+	
1224
+	
1225
 }
1226
\ No newline at end of file
1227
diff --git java/com/l2jmega/gameserver/network/SystemMessageId.java java/com/l2jmega/gameserver/network/SystemMessageId.java
1228
index 77a5c12..786f21b 100644
1229
--- java/com/l2jmega/gameserver/network/SystemMessageId.java
1230
+++ java/com/l2jmega/gameserver/network/SystemMessageId.java
1231
@@ -6,6 +6,8 @@
1232
 import java.util.logging.Level;
1233
 import java.util.logging.Logger;
1234
 
1235
+
1236
+
1237
 import com.l2jmega.gameserver.network.serverpackets.SystemMessage;
1238
 
1239
 /**
1240
@@ -11800,6 +11802,21 @@
1241
 	
1242
 	public static final SystemMessageId EVENT;
1243
 	
1244
+	public static final SystemMessageId ACTIVATE_SUMMON_ACTACK;	
1245
+	
1246
+	
1247
+	
1248
+	public static final SystemMessageId WILL_BE_MOVED_INTERFACE;
1249
+	public static final SystemMessageId DESACTIVATE_SUMMON_ACTACK;	
1250
+	public static final SystemMessageId ACTIVATE_RESPECT_HUNT;
1251
+	public static final SystemMessageId DESACTIVATE_RESPECT_HUNT;
1252
+	
1253
+	public static final SystemMessageId AUTO_FARM_DESACTIVATED;
1254
+	public static final SystemMessageId AUTO_FARM_ACTIVATED;
1255
+	
1256
+	
1257
+	
1258
+	
1259
 	/**
1260
 	 * Array containing all SystemMessageIds<br>
1261
 	 * Important: Always initialize with a length of the highest SystemMessageId + 1!!!
1262
@@ -13768,6 +13785,13 @@
1263
 		S1_CANNOT_PARTICIPATE_IN_OLYMPIAD_DURING_TELEPORT = new SystemMessageId(2029);
1264
 		CURRENTLY_LOGGING_IN = new SystemMessageId(2030);
1265
 		PLEASE_WAIT_A_MOMENT = new SystemMessageId(2031);
1266
+		WILL_BE_MOVED_INTERFACE = new SystemMessageId(2154);
1267
+		AUTO_FARM_DESACTIVATED = new SystemMessageId(2155);
1268
+		ACTIVATE_SUMMON_ACTACK = new SystemMessageId(2156);
1269
+		DESACTIVATE_SUMMON_ACTACK = new SystemMessageId(2157);		
1270
+		ACTIVATE_RESPECT_HUNT = new SystemMessageId(2158);
1271
+		DESACTIVATE_RESPECT_HUNT = new SystemMessageId(2159);
1272
+		AUTO_FARM_ACTIVATED = new SystemMessageId(2160);
1273
 		EVENT = new SystemMessageId(2500);
1274
 		
1275
 		buildFastLookupTable();
1276
diff --git java/com/l2jmega/gameserver/network/clientpackets/EnterWorld.java java/com/l2jmega/gameserver/network/clientpackets/EnterWorld.java
1277
index b5006c9..872ac51 100644
1278
--- java/com/l2jmega/gameserver/network/clientpackets/EnterWorld.java
1279
+++ java/com/l2jmega/gameserver/network/clientpackets/EnterWorld.java
1280
@@ -238,6 +238,28 @@
1281
 			}
1282
 		}
1283
 		
1284
+		
1285
+		activeChar.loadAutoFarmSettings();
1286
+		
1287
+	
1288
+		
1289
+		
1290
+		
1291
+		
1292
+		
1293
+		
1294
+		if(activeChar.isSummonAttack()) {
1295
+			activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
1296
+			
1297
+		}
1298
+		
1299
+		if(activeChar.isAntiKsProtected()) {
1300
+			activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_RESPECT_HUNT));
1301
+		}
1302
+		
1303
+		
1304
+		
1305
+		
1306
 		// activeChar.sendPacket(SevenSigns.getInstance().getCurrentPeriod().getMessageId());
1307
 		
1308
 		// if player is DE, check for shadow sense skill at night
1309
diff --git java/com/l2jmega/gameserver/network/clientpackets/RequestBypassToServer.java java/com/l2jmega/gameserver/network/clientpackets/RequestBypassToServer.java
1310
index 80e4aae..9564401 100644
1311
--- java/com/l2jmega/gameserver/network/clientpackets/RequestBypassToServer.java
1312
+++ java/com/l2jmega/gameserver/network/clientpackets/RequestBypassToServer.java
1313
@@ -34,6 +34,7 @@
1314
 import com.l2jmega.gameserver.network.serverpackets.ActionFailed;
1315
 import com.l2jmega.gameserver.network.serverpackets.CreatureSay;
1316
 import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage;
1317
+import com.l2jmega.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
1318
 import com.l2jmega.gameserver.network.serverpackets.HennaInfo;
1319
 import com.l2jmega.gameserver.network.serverpackets.NpcHtmlMessage;
1320
 import com.l2jmega.gameserver.network.serverpackets.PlaySound;
1321
@@ -55,6 +56,8 @@
1322
 import com.l2jmega.commons.lang.StringUtil;
1323
 import com.l2jmega.commons.random.Rnd;
1324
 
1325
+import Base.AutoFarm.AutofarmPlayerRoutine;
1326
+
1327
 public final class RequestBypassToServer extends L2GameClientPacket
1328
 {
1329
 	private static final Logger GMAUDIT_LOG = Logger.getLogger("gmaudit");
1330
@@ -75,10 +78,14 @@
1331
 		if (!FloodProtectors.performAction(getClient(), Action.SERVER_BYPASS) && !_command.startsWith("voiced_getbuff"))
1332
 			return;
1333
 		
1334
+		
1335
 		final Player activeChar = getClient().getActiveChar();
1336
 		if (activeChar == null)
1337
 			return;
1338
 		
1339
+				final AutofarmPlayerRoutine bot = activeChar.getBot();
1340
+				
1341
+		
1342
 		if (_command.isEmpty())
1343
 		{
1344
 			_log.info(activeChar.getName() + " sent an empty requestBypass packet.");
1345
@@ -114,6 +121,106 @@
1346
 				
1347
 				ach.useAdminCommand(_command, activeChar);
1348
 			}
1349-
1349+
1350-
+			else if (_command.startsWith("_infosettings"))
1350+
1351
+			else if (_command.startsWith("_autofarm"))
1352-
+				showAutoFarm(activeChar);
1352+
1353
+				if (activeChar.isAutoFarm())
1354
+				{
1355
+					bot.stop();
1356
+					activeChar.setAutoFarm(false);
1357
+				}
1358
+				else
1359
+				{
1360
+					bot.start();
1361
+					activeChar.setAutoFarm(true);
1362
+				}
1363
+				
1364
+			}
1365
+			
1366
+			if (_command.startsWith("_pageAutoFarm"))
1367
+			{
1368
+				StringTokenizer st = new StringTokenizer(_command, " ");
1369
+				st.nextToken();
1370
+				try
1371
+				{
1372
+					String param = st.nextToken();
1373
+					
1374
+					if (param.startsWith("inc_page") || param.startsWith("dec_page"))
1375
+					{
1376
+						int newPage;
1377
+						
1378
+						if (param.startsWith("inc_page"))
1379
+						{
1380
+							newPage = activeChar.getPage() + 1;
1381
+						}
1382
+						else
1383
+						{
1384
+							newPage = activeChar.getPage() - 1;
1385
+						}
1386
+						
1387
+						if (newPage >= 0 && newPage <= 9)
1388
+						{
1389
+							String[] pageStrings =
1390
+							{
1391
+								"F1",
1392
+								"F2",
1393
+								"F3",
1394
+								"F4",
1395
+								"F5",
1396
+								"F6",
1397
+								"F7",
1398
+								"F8",
1399
+								"F9",
1400
+								"F10"
1401
+							};
1402
+							
1403
+							activeChar.setPage(newPage);
1404
+							activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Skill Bar " + pageStrings[newPage], 3 * 1000, SMPOS.TOP_CENTER, false));
1405
+							activeChar.saveAutoFarmSettings();
1406
+							
1407
+						}
1408
+						
1409
+					}
1410
+					
1411
+				}
1412
+				catch (Exception e)
1413
+				{
1414
+					e.printStackTrace();
1415
+				}
1416
+			}
1417
+			
1418
+			if (_command.startsWith("_enableBuffProtect"))
1419
+			{
1420
+				activeChar.setNoBuffProtection(!activeChar.isNoBuffProtected());
1421
+				if (activeChar.isNoBuffProtected())
1422
+				{
1423
+					activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Buff Protect On", 3 * 1000, SMPOS.TOP_CENTER, false));
1424
+				}
1425
+				else
1426
+				{
1427
+					activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Buff Protect Off", 3 * 1000, SMPOS.TOP_CENTER, false));
1428
+				}
1429
+				activeChar.saveAutoFarmSettings();
1430
+			}
1431
+			if (_command.startsWith("_enableSummonAttack"))
1432
+			{
1433
+				activeChar.setSummonAttack(!activeChar.isSummonAttack());
1434
+				if (activeChar.isSummonAttack())
1435
+				{
1436
+					activeChar.sendPacket(new SystemMessage(SystemMessageId.ACTIVATE_SUMMON_ACTACK));
1437
+					activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack On", 3 * 1000, SMPOS.TOP_CENTER, false));
1438
+				}
1439
+				else
1440
+				{
1441
+					activeChar.sendPacket(new SystemMessage(SystemMessageId.DESACTIVATE_SUMMON_ACTACK));
1442
+					activeChar.sendPacket(new ExShowScreenMessage("Auto Farm Summon Attack Off", 3 * 1000, SMPOS.TOP_CENTER, false));
1443
+				}
1444
+				activeChar.saveAutoFarmSettings();
1445
+			}
1446
+			
1447
+			
1448
+			
1449
 			else if (_command.startsWith("voiced_"))
1450
 			{
1451
 				String command = _command.split(" ")[0];
1452
diff --git java/com/l2jmega/gameserver/network/serverpackets/Die.java java/com/l2jmega/gameserver/network/serverpackets/Die.java
1453
index 10d58c0..889e0fc 100644
1454
--- java/com/l2jmega/gameserver/network/serverpackets/Die.java
1455
+++ java/com/l2jmega/gameserver/network/serverpackets/Die.java
1456
@@ -11,6 +11,10 @@
1457
 import com.l2jmega.gameserver.model.entity.Siege.SiegeSide;
1458-
1458+
1459-
1459+
1460-
1460+
1461
+
1462
+
1463
+
1464
 public class Die extends L2GameServerPacket
1465
 {
1466
 	private final Creature _activeChar;
1467
@@ -31,9 +35,17 @@
1468
 		if (cha instanceof Player)
1469-
+		html.setFile("data/html/mods/menu/AutoFarm.htm");
1469+
1470
 			Player player = (Player) cha;
1471
+			final AutofarmPlayerRoutine bot = player.getBot();
1472
 			_allowFixedRes = player.getAccessLevel().allowFixedRes();
1473
 			_clan = player.getClan();
1474
 			_canEvent = !(((TvT.is_started() || TvT.is_teleport()) && player._inEventTvT) || ((CTF.is_started() || CTF.is_teleport()) && player._inEventCTF) || cha.isInArenaEvent());
1475
+		
1476
+			
1477
+	    	if (player.isAutoFarm())
1478
+	    	{
1479
+	    		bot.stop();
1480
+	    		player.setAutoFarm(false);
1481
+	    	}
1482
 			
1483
 		}
1484
 		else if (cha instanceof Attackable)
1485-
1485+