View difference between Paste ID: aVD4gTrE and 9WsMDyYB
SHOW: | | - or go back to the newest paste.
1
--- a/aCis_datapack/data/xml/bufferSkills.xml
2
+++ b/aCis_datapack/data/xml/bufferSkills.xml
3
@@ -37,7 +37,7 @@
4
 		<buff id="1397" desc="Decreases MP consumption rate."/><!-- Clarity -->
5
 		<buff id="1413" desc="Increases mage abilities."/><!-- Magnus' Chant -->
6
 	</category>
7
-	<category type="Dances">
8
+	<category type="Other">
9
 		<buff id="271" desc="Increases P. Atk."/><!-- Dance of the Warrior -->
10
 		<buff id="272" desc="Increases Accuracy."/><!-- Dance of Inspiration -->
11
 		<buff id="273" desc="Increases M. Atk."/><!-- Dance of the Mystic -->
12
@@ -50,8 +50,6 @@
13
 		<buff id="310" desc="Restores HP by inflicted damage."/><!-- Dance of the Vampire -->
14
 		<buff id="311" desc="Increases resistance to terrain damage."/><!-- Dance of Protection -->
15
 		<buff id="365" desc="Increases rate of magic crit. damage."/><!-- Siren's Dance -->
16
-	</category>
17
-	<category type="Songs">
18
 		<buff id="264" desc="Increases P. Def."/><!-- Song of Earth -->
19
 		<buff id="265" desc="Increases HP regeneration."/><!-- Song of Life -->
20
 		<buff id="266" desc="Increases Evasion."/><!-- Song of Water -->
21
diff --git a/aCis_datapack/data/xml/npcs/50000-50999.xml b/aCis_datapack/data/xml/npcs/50000-50999.xml
22
index cfcc992..3adcd84 100644
23
--- a/aCis_datapack/data/xml/npcs/50000-50999.xml
24
+++ b/aCis_datapack/data/xml/npcs/50000-50999.xml
25
@@ -82,7 +82,7 @@
26
 		<set name="height" val="18"/>
27
 		<set name="rHand" val="0"/>
28
 		<set name="lHand" val="0"/>
29
-		<set name="type" val="SchemeBuffer"/>
30
+		<set name="type" val="PlayerBuffer"/>
31
 		<set name="exp" val="0"/>
32
 		<set name="sp" val="0"/>
33
 		<set name="hp" val="2444.46819"/>
34
diff --git a/aCis_gameserver/config/npcs.properties b/aCis_gameserver/config/npcs.properties
35
index c05f8a9..e99f647 100644
36
--- a/aCis_gameserver/config/npcs.properties
37
+++ b/aCis_gameserver/config/npcs.properties
38
@@ -201,4 +201,31 @@
39
 MinNPCAnimation = 20
40
 MaxNPCAnimation = 40
41
 MinMonsterAnimation = 10
42
-MaxMonsterAnimation = 40
43
\ No newline at end of file
44
+MaxMonsterAnimation = 40
45
+
46
+ #=============================================================
47
+#                          Buffer
48
+#=============================================================
49
+
50
+# Maximum number of available schemes per player.
51
+BufferMaxSchemesPerChar = 4
52
+
53
+# Maximum number of buffs per scheme.
54
+BufferMaxSkillsPerScheme = 24
55
+
56
+# Static cost of buffs ; override skills price if different of -1.
57
+BufferStaticCostPerBuff = -1
58
+
59
+# Fighter Set List
60
+FighterSkillList = 1204;1045;1068;1040;1035;1086;1242;1268;1036;1240;1077;1087;271;272;274;275;310;264;266;267;268;269;270;304;305;349;364;1388;1363;4699;1393;1392;1352;1353;1354;306;1259;1182;1189;1191
61
+# Mage Set List
62
+MageSkillList = 1204;1048;1045;1040;1035;1085;1303;1243;1304;1036;1087;1059;1078;1062;273;365;1393;1392;1352;1353;1354;307;309;306;308;1259;1182;1191;1033;1391;1363;264;266;267;268;270;304;349;4703;276
63
+
64
+# Buffer List, skillId, skillevel, buffPrice,type.
65
+BufferBuffs = 264,1,0,Songs;265,1,0,Songs;266,1,0,Songs;267,1,0,Songs;268,1,0,Songs;269,1,0,Songs;270,1,0,Songs;304,1,0,Songs;305,1,0,Songs;306,1,0,Songs;308,1,0,Songs;349,1,0,Songs;363,1,0,Songs;364,1,0,Songs;271,1,0,Dances;272,1,0,Dances;273,1,0,Dances;274,1,0,Dances;275,1,0,Dances;276,1,0,Dances;277,1,0,Dances;309,1,0,Dances;310,1,0,Dances;311,1,0,Dances;307,1,0,Dances;365,1,0,Dances;1002,1,0,Warcryer;1006,1,0,Warcryer;1007,1,0,Warcryer;1009,1,0,Warcryer;1308,1,0,Warcryer;1309,1,0,Warcryer;1310,1,0,Warcryer;1362,1,0,Warcryer;1390,1,0,Warcryer;1391,1,0,Warcryer;1413,1,0,Warcryer;1416,1,0,Overlord;1003,1,0,Overlord;1004,1,0,Overlord;1005,1,0,Overlord;1008,1,0,Overlord;1249,1,0,Overlord;1364,1,0,Overlord;1365,1,0,Overlord;1032,1,0,Prophet;1033,1,0,Prophet;1035,1,0,Prophet;1036,1,0,Prophet;1040,1,0,Prophet;1043,1,0,Prophet;1044,1,0,Prophet;1045,1,0,Prophet;1048,1,0,Prophet;1059,1,0,Shillen_Elder;1062,1,0,Prophet;1068,1,0,Prophet;1073,1,0,Elder;1077,1,0,Shillen_Elder;1078,1,0,Shillen_Elder;1085,1,0,Prophet;1086,1,0,Prophet;1087,1,0,Elder;1182,1,0,Elder;1189,1,0,Shillen_Elder;1191,1,0,Prophet;1204,1,0,Prophet;1242,1,0,Shillen_Elder;1243,1,0,Prophet;1259,1,0,Elder;1268,1,0,Shillen_Elder;1303,1,0,Shillen_Elder;1304,1,0,Elder;1352,1,0,Elder;1353,1,0,Elder;1354,1,0,Elder;1388,1,0,Shillen_Elder;1389,1,0,Shillen_Elder;1392,1,0,Prophet;1393,1,0,Elder;1397,1,0,Elder;1355,1,0,Elder;4699,1,0,Elder;4700,1,0,Elder;4702,1,0,Elder;4703,1,0,Elder;1356,1,0,Prophet;1357,1,0,Shillen_Elder;1363,1,0,Warcryer;1414,1,0,Overlord
66
+
67
+RestrictUseBufferOnPvPFlag = true
68
+RestrictUseBufferInCombat = true
69
+
70
+VoteBuffItemId = 57
71
+VoteBuffItemCount = 15
72
\ No newline at end of file
73
diff --git a/aCis_gameserver/java/net/sf/l2j/Config.java b/aCis_gameserver/java/net/sf/l2j/Config.java
74
index 65daaa6..ae3938c 100644
75
--- a/aCis_gameserver/java/net/sf/l2j/Config.java
76
+++ b/aCis_gameserver/java/net/sf/l2j/Config.java
77
@@ -16,6 +16,7 @@
78
 import net.sf.l2j.commons.math.MathUtil;
79
 
80
 import net.sf.l2j.gameserver.enums.GeoType;
81
+import net.sf.l2j.gameserver.model.holder.BuffSkillHolder;
82
 import net.sf.l2j.gameserver.model.holder.IntIntHolder;
83
 
84
 /**
85
@@ -326,6 +327,26 @@
86
 	public static int MIN_MONSTER_ANIMATION;
87
 	public static int MAX_MONSTER_ANIMATION;
88
 	
89
+	/** Buffer */
90
+	public static String PFIGHTER_SET;
91
+	public static int[] PFIGHTER_SET_LIST;
92
+	public static String PMAGE_SET;
93
+	public static int[] PMAGE_SET_LIST;
94
+	public static int PBUFFER_MAX_SCHEMES;
95
+	public static int PBUFFER_MAX_SKILLS;
96
+	public static int PBUFFER_STATIC_BUFF_COST;
97
+	public static String PBUFFER_BUFFS;
98
+	public static Map<Integer, BuffSkillHolder> PBUFFER_BUFFLIST;
99
+	
100
+	public static List<Integer> PFIGHTER_SKILL_LIST;
101
+	public static List<Integer> PMAGE_SKILL_LIST;
102
+	
103
+	public static boolean PRESTRICT_USE_BUFFER_ON_PVPFLAG;
104
+	public static boolean PRESTRICT_USE_BUFFER_IN_COMBAT;
105
+	
106
+	public static int PVOTE_BUFF_ITEM_ID;
107
+	public static int PVOTE_BUFF_ITEM_COUNT;
108
+	
109
 	// --------------------------------------------------
110
 	// Players
111
 	// --------------------------------------------------
112
@@ -949,6 +970,45 @@
113
 		MAX_NPC_ANIMATION = npcs.getProperty("MaxNPCAnimation", 40);
114
 		MIN_MONSTER_ANIMATION = npcs.getProperty("MinMonsterAnimation", 10);
115
 		MAX_MONSTER_ANIMATION = npcs.getProperty("MaxMonsterAnimation", 40);
116
+		
117
+		PBUFFER_MAX_SCHEMES = npcs.getProperty("BufferMaxSchemesPerChar", 4);
118
+		PBUFFER_MAX_SKILLS = npcs.getProperty("BufferMaxSkillsPerScheme", 24);
119
+		PBUFFER_STATIC_BUFF_COST = npcs.getProperty("BufferStaticCostPerBuff", -1);
120
+		PBUFFER_BUFFS = npcs.getProperty("BufferBuffs");
121
+		
122
+		PFIGHTER_SET = npcs.getProperty("FighterSet", "2375,3500,3501,3502,4422,4423,4424,4425,6648,6649,6650");
123
+		PMAGE_SET = npcs.getProperty("MageSet", "2375,3500,3501,3502,4422,4423,4424,4425,6648,6649,6650");
124
+		
125
+		String[] FighterList = PFIGHTER_SET.split(",");
126
+		PFIGHTER_SET_LIST = new int[FighterList.length];
127
+		for (int i = 0; i < FighterList.length; i++)
128
+			PFIGHTER_SET_LIST[i] = Integer.parseInt(FighterList[i]);
129
+		
130
+		String[] MageList = PMAGE_SET.split(",");
131
+		PMAGE_SET_LIST = new int[MageList.length];
132
+		for (int i = 0; i < MageList.length; i++)
133
+			PMAGE_SET_LIST[i] = Integer.parseInt(MageList[i]);
134
+		
135
+		PBUFFER_BUFFLIST = new HashMap<>();
136
+		for (String skillInfo : PBUFFER_BUFFS.split(";"))
137
+		{
138
+			final String[] infos = skillInfo.split(",");
139
+			PBUFFER_BUFFLIST.put(Integer.valueOf(infos[0]), new BuffSkillHolder(Integer.valueOf(infos[0]), Integer.valueOf(infos[1]), Integer.valueOf(infos[2]), infos[3], skillInfo));
140
+		}
141
+		
142
+		PRESTRICT_USE_BUFFER_ON_PVPFLAG = npcs.getProperty("RestrictUseBufferOnPvPFlag", true);
143
+		PRESTRICT_USE_BUFFER_IN_COMBAT = npcs.getProperty("RestrictUseBufferInCombat", true);
144
+		
145
+		PVOTE_BUFF_ITEM_ID = npcs.getProperty("VoteBuffItemId", 57);
146
+		PVOTE_BUFF_ITEM_COUNT = npcs.getProperty("VoteBuffItemCount", 1);
147
+		
148
+		PFIGHTER_SKILL_LIST = new ArrayList<>();
149
+		for (String skill_id : npcs.getProperty("FighterSkillList", "").split(";"))
150
+			PFIGHTER_SKILL_LIST.add(Integer.parseInt(skill_id));
151
+		
152
+		PMAGE_SKILL_LIST = new ArrayList<>();
153
+		for (String skill_id : npcs.getProperty("MageSkillList", "").split(";"))
154
+			PMAGE_SKILL_LIST.add(Integer.parseInt(skill_id));
155
 	}
156
 	
157
 	/**
158
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/PlayerBuffer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/PlayerBuffer.java
159
new file mode 100644
160
index 0000000..284f86a
161
--- /dev/null
162
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/PlayerBuffer.java
163
@@ -0,0 +1,524 @@
164
+package net.sf.l2j.gameserver.model.actor.instance;
165
+
166
+import java.util.ArrayList;
167
+import java.util.List;
168
+import java.util.Map;
169
+import java.util.StringTokenizer;
170
+
171
+import net.sf.l2j.commons.lang.StringUtil;
172
+import net.sf.l2j.commons.math.MathUtil;
173
+
174
+import net.sf.l2j.Config;
175
+import net.sf.l2j.gameserver.data.SkillTable;
176
+import net.sf.l2j.gameserver.data.manager.BufferManager;
177
+import net.sf.l2j.gameserver.model.actor.Creature;
178
+import net.sf.l2j.gameserver.model.actor.Player;
179
+import net.sf.l2j.gameserver.model.actor.Summon;
180
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
181
+import net.sf.l2j.gameserver.network.serverpackets.ItemList;
182
+import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
183
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
184
+import net.sf.l2j.gameserver.skills.L2Skill;
185
+
186
+/**
187
+ * @author Baggos
188
+ */
189
+public class PlayerBuffer extends Folk
190
+{
191
+	private static final int PAGE_LIMIT = 6;
192
+	
193
+	public PlayerBuffer(int objectId, NpcTemplate template)
194
+	{
195
+		super(objectId, template);
196
+	}
197
+	
198
+	private void showMainWindow(Player activeChar)
199
+	{
200
+		final NpcHtmlMessage html = new NpcHtmlMessage(0);
201
+		html.setFile(getHtmlPath(getNpcId(), 0));
202
+		html.replace("%objectId%", String.valueOf(getObjectId()));
203
+		html.replace("%name%", activeChar.getName());
204
+		html.replace("%buffcount%", "You have " + activeChar.getBuffCount() + "/" + activeChar.getMaxBuffCount() + " buffs.");
205
+		
206
+		activeChar.sendPacket(html);
207
+	}
208
+	
209
+	@Override
210
+	public void onBypassFeedback(Player player, String command)
211
+	{
212
+		if (player.getPvpFlag() > 0 && Config.PRESTRICT_USE_BUFFER_ON_PVPFLAG)
213
+		{
214
+			player.sendMessage("You can't use buffer when you are pvp flagged.");
215
+			return;
216
+		}
217
+		
218
+		if (player.isInCombat() && Config.PRESTRICT_USE_BUFFER_IN_COMBAT)
219
+		{
220
+			player.sendMessage("You can't use buffer when you are in combat.");
221
+			return;
222
+		}
223
+		
224
+		if (player.isDead())
225
+			return;
226
+		
227
+		StringTokenizer st = new StringTokenizer(command, " ");
228
+		String actualCommand = st.nextToken();
229
+		
230
+		if (actualCommand.startsWith("bufflist"))
231
+		{
232
+			autoBuffFunction(player, st.nextToken());
233
+		}
234
+		else if (actualCommand.startsWith("restore"))
235
+		{
236
+			String noble = st.nextToken();
237
+			player.getStatus().setMaxCpHpMp();
238
+			
239
+			if (noble.equals("true"))
240
+			{
241
+				SkillTable.getInstance().getInfo(1323, 1).getEffects(player, player);
242
+				player.broadcastPacket(new MagicSkillUse(this, player, 1323, 1, 850, 0));
243
+			}
244
+			
245
+			final Summon summon = player.getSummon();
246
+			if (summon != null)
247
+				summon.getStatus().setMaxHpMp();
248
+			
249
+			showMainWindow(player);
250
+		}
251
+		else if (actualCommand.startsWith("cancellation"))
252
+		{
253
+			L2Skill buff;
254
+			buff = SkillTable.getInstance().getInfo(1056, 1);
255
+			buff.getEffects(this, player);
256
+			player.stopAllEffectsExceptThoseThatLastThroughDeath();
257
+			player.broadcastPacket(new MagicSkillUse(this, player, 1056, 1, 850, 0));
258
+			player.stopAllEffects();
259
+			
260
+			final Summon summon = player.getSummon();
261
+			if (summon != null)
262
+				summon.stopAllEffects();
263
+			
264
+			showMainWindow(player);
265
+		}
266
+		else if (actualCommand.startsWith("openlist"))
267
+		{
268
+			String category = st.nextToken();
269
+			String htmfile = st.nextToken();
270
+			
271
+			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
272
+			
273
+			if (category.startsWith("null"))
274
+			{
275
+				html.setFile("data/html/mods/buffer/" + htmfile + ".htm");
276
+				
277
+				// First Page
278
+				if (htmfile.equals("index"))
279
+				{
280
+					html.replace("%name%", player.getName());
281
+					html.replace("%buffcount%", "You have " + player.getBuffCount() + "/" + player.getMaxBuffCount() + " buffs.");
282
+				}
283
+			}
284
+			else
285
+				html.setFile("data/html/mods/buffer/" + category + "/" + htmfile + ".htm");
286
+			
287
+			html.replace("%objectId%", String.valueOf(getObjectId()));
288
+			player.sendPacket(html);
289
+		}
290
+		
291
+		else if (actualCommand.startsWith("dobuff"))
292
+		{
293
+			int buffid = Integer.valueOf(st.nextToken());
294
+			int bufflevel = Integer.valueOf(st.nextToken());
295
+			String category = st.nextToken();
296
+			String windowhtml = st.nextToken();
297
+			String votebuff = null;
298
+			
299
+			if (st.hasMoreTokens())
300
+				votebuff = st.nextToken();
301
+			
302
+			if (windowhtml.equals("malaria"))
303
+			{
304
+				if (player.getInventory().getItemCount(Config.PVOTE_BUFF_ITEM_ID, 0) >= 1)
305
+				{
306
+					player.getInventory().destroyItemByItemId("VoteCoins", Config.PVOTE_BUFF_ITEM_ID, 1, player, null);
307
+					player.getInventory().updateDatabase();
308
+					player.sendPacket(new ItemList(player, true));
309
+					player.sendMessage(1 + " Vote eye destroyed.");
310
+				}
311
+				else
312
+				{
313
+					player.sendMessage("You dont have enough (" + 1 + ") vote item for buff.");
314
+					return;
315
+				}
316
+			}
317
+			
318
+			if (votebuff != null)
319
+			{
320
+				if (player.getInventory().getItemCount(Config.PVOTE_BUFF_ITEM_ID, 0) >= Config.PVOTE_BUFF_ITEM_COUNT)
321
+				{
322
+					player.getInventory().destroyItemByItemId("VoteCoins", Config.PVOTE_BUFF_ITEM_ID, Config.PVOTE_BUFF_ITEM_COUNT, player, null);
323
+					player.getInventory().updateDatabase();
324
+					player.sendPacket(new ItemList(player, true));
325
+					player.sendMessage(Config.PVOTE_BUFF_ITEM_COUNT + " vote stone destroyed.");
326
+				}
327
+				else
328
+				{
329
+					player.sendMessage("You dont have enough (" + Config.PVOTE_BUFF_ITEM_COUNT + ") vote item for buff.");
330
+					return;
331
+				}
332
+			}
333
+			
334
+			Creature target = player;
335
+			if (category.startsWith("pet"))
336
+			{
337
+				if (player.getSummon() == null)
338
+				{
339
+					player.sendMessage("Incorrect Pet");
340
+					showMainWindow(player);
341
+					return;
342
+				}
343
+				target = player.getSummon();
344
+			}
345
+			
346
+			MagicSkillUse mgc = new MagicSkillUse(this, target, buffid, bufflevel, 1150, 0);
347
+			player.sendPacket(mgc);
348
+			player.broadcastPacket(mgc);
349
+			SkillTable.getInstance().getInfo(buffid, bufflevel).getEffects(this, target);
350
+			
351
+			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
352
+			html.setFile("data/html/mods/buffer/" + category + "/" + windowhtml + ".htm");
353
+			html.replace("%objectId%", String.valueOf(getObjectId()));
354
+			html.replace("%name%", player.getName());
355
+			player.sendPacket(html);
356
+		}
357
+		else if (actualCommand.startsWith("getbuff"))
358
+		{
359
+			int buffid = Integer.valueOf(st.nextToken());
360
+			int bufflevel = Integer.valueOf(st.nextToken());
361
+			if (buffid != 0)
362
+			{
363
+				SkillTable.getInstance().getInfo(buffid, bufflevel).getEffects(this, player);
364
+				broadcastPacket(new MagicSkillUse(this, player, buffid, bufflevel, 450, 0));
365
+				showMainWindow(player);
366
+			}
367
+		}
368
+		else if (actualCommand.startsWith("support"))
369
+		{
370
+			showGiveBuffsWindow(player);
371
+		}
372
+		else if (actualCommand.startsWith("givebuffs"))
373
+		{
374
+			final String schemeName = st.nextToken();
375
+			final int cost = Integer.parseInt(st.nextToken());
376
+			
377
+			Creature target = null;
378
+			if (st.hasMoreTokens())
379
+			{
380
+				final String targetType = st.nextToken();
381
+				if (targetType != null && targetType.equalsIgnoreCase("pet"))
382
+					target = player.getSummon();
383
+			}
384
+			else
385
+				target = player;
386
+			
387
+			if (target == null)
388
+				player.sendMessage("You don't have a pet.");
389
+			else if (cost == 0 || player.reduceAdena("NPC Buffer", cost, this, true))
390
+				BufferManager.getInstance().applySchemeEffects(this, target, player.getObjectId(), schemeName);
391
+		}
392
+		else if (actualCommand.startsWith("editschemes"))
393
+		{
394
+			showEditSchemeWindow(player, st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()));
395
+		}
396
+		else if (actualCommand.startsWith("skill"))
397
+		{
398
+			final String groupType = st.nextToken();
399
+			final String schemeName = st.nextToken();
400
+			
401
+			final int skillId = Integer.parseInt(st.nextToken());
402
+			final int page = Integer.parseInt(st.nextToken());
403
+			
404
+			final List<Integer> skills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName);
405
+			
406
+			if (actualCommand.startsWith("skillselect") && !schemeName.equalsIgnoreCase("none"))
407
+			{
408
+				if (skills.size() < player.getMaxBuffCount())
409
+					skills.add(skillId);
410
+				else
411
+					player.sendMessage("This scheme has reached the maximum amount of buffs.");
412
+			}
413
+			else if (actualCommand.startsWith("skillunselect"))
414
+				skills.remove(Integer.valueOf(skillId));
415
+			
416
+			showEditSchemeWindow(player, groupType, schemeName, page);
417
+		}
418
+		else if (actualCommand.startsWith("createscheme"))
419
+		{
420
+			try
421
+			{
422
+				final String schemeName = st.nextToken();
423
+				if (schemeName.length() > 14)
424
+				{
425
+					player.sendMessage("Scheme's name must contain up to 14 chars. Spaces are trimmed.");
426
+					return;
427
+				}
428
+				
429
+				final Map<String, ArrayList<Integer>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId());
430
+				if (schemes != null)
431
+				{
432
+					if (schemes.size() == Config.PBUFFER_MAX_SCHEMES)
433
+					{
434
+						player.sendMessage("Maximum schemes amount is already reached.");
435
+						return;
436
+					}
437
+					
438
+					if (schemes.containsKey(schemeName))
439
+					{
440
+						player.sendMessage("The scheme name already exists.");
441
+						return;
442
+					}
443
+				}
444
+				
445
+				BufferManager.getInstance().setScheme(player.getObjectId(), schemeName.trim(), new ArrayList<>());
446
+				showGiveBuffsWindow(player);
447
+			}
448
+			catch (Exception e)
449
+			{
450
+				player.sendMessage("Scheme's name must contain up to 14 chars. Spaces are trimmed.");
451
+			}
452
+		}
453
+		else if (actualCommand.startsWith("deletescheme"))
454
+		{
455
+			try
456
+			{
457
+				final String schemeName = st.nextToken();
458
+				final Map<String, ArrayList<Integer>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId());
459
+				
460
+				if (schemes != null && schemes.containsKey(schemeName))
461
+					schemes.remove(schemeName);
462
+			}
463
+			catch (Exception e)
464
+			{
465
+				player.sendMessage("This scheme name is invalid.");
466
+			}
467
+			showGiveBuffsWindow(player);
468
+		}
469
+		
470
+		super.onBypassFeedback(player, command);
471
+	}
472
+	
473
+	@Override
474
+	public String getHtmlPath(int npcId, int val)
475
+	{
476
+		String filename = "";
477
+		if (val == 0)
478
+			filename = "" + npcId;
479
+		else
480
+			filename = npcId + "-" + val;
481
+		
482
+		return "data/html/mods/buffer/" + filename + ".htm";
483
+	}
484
+	
485
+	/**
486
+	 * Send an html packet to the {@link Player} set a parameter with Give Buffs menu info for player and pet, depending on targetType parameter {player, pet}.
487
+	 * @param player : The {@link Player} to make checks on.
488
+	 */
489
+	private void showGiveBuffsWindow(Player player)
490
+	{
491
+		final StringBuilder sb = new StringBuilder(200);
492
+		
493
+		final Map<String, ArrayList<Integer>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId());
494
+		if (schemes == null || schemes.isEmpty())
495
+			sb.append("<font color=\"LEVEL\">You haven't defined any scheme.</font>");
496
+		else
497
+		{
498
+			for (Map.Entry<String, ArrayList<Integer>> scheme : schemes.entrySet())
499
+			{
500
+				final int cost = getFee(scheme.getValue());
501
+				StringUtil.append(sb, "<font color=\"LEVEL\">", scheme.getKey(), " [", scheme.getValue().size(), " / ", player.getMaxBuffCount(), "]", ((cost > 0) ? " - cost: " + StringUtil.formatNumber(cost) : ""), "</font><br1>");
502
+				StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_givebuffs ", scheme.getKey(), " ", cost, "\">Use on Me</a>&nbsp;|&nbsp;");
503
+				StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_givebuffs ", scheme.getKey(), " ", cost, " pet\">Use on Pet</a>&nbsp;|&nbsp;");
504
+				StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_editschemes Buffs ", scheme.getKey(), " 1\">Edit</a>&nbsp;|&nbsp;");
505
+				StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_deletescheme ", scheme.getKey(), "\">Delete</a><br>");
506
+			}
507
+		}
508
+		
509
+		final NpcHtmlMessage html = new NpcHtmlMessage(0);
510
+		html.setFile(getHtmlPath(getNpcId(), 1));
511
+		html.replace("%schemes%", sb.toString());
512
+		html.replace("%max_schemes%", Config.PBUFFER_MAX_SCHEMES);
513
+		html.replace("%objectId%", getObjectId());
514
+		player.sendPacket(html);
515
+	}
516
+	
517
+	/**
518
+	 * Send an html packet to the {@link Player} set as parameter with Edit Scheme Menu info. This allows the {@link Player} to edit each created scheme (add/delete skills)
519
+	 * @param player : The {@link Player} to make checks on.
520
+	 * @param groupType : The group of skills to select.
521
+	 * @param schemeName : The scheme to make check.
522
+	 * @param page : The current checked page.
523
+	 */
524
+	private void showEditSchemeWindow(Player player, String groupType, String schemeName, int page)
525
+	{
526
+		final NpcHtmlMessage html = new NpcHtmlMessage(0);
527
+		final List<Integer> schemeSkills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName);
528
+		
529
+		html.setFile(getHtmlPath(getNpcId(), 2));
530
+		html.replace("%schemename%", schemeName);
531
+		html.replace("%count%", schemeSkills.size() + " / " + player.getMaxBuffCount());
532
+		html.replace("%typesframe%", getTypesFrame(groupType, schemeName));
533
+		html.replace("%skilllistframe%", getGroupSkillList(player, groupType, schemeName, page));
534
+		html.replace("%objectId%", getObjectId());
535
+		player.sendPacket(html);
536
+	}
537
+	
538
+	/**
539
+	 * @param player : The {@link Player} to make checks on.
540
+	 * @param groupType : The group of skills to select.
541
+	 * @param schemeName : The scheme to make check.
542
+	 * @param page : The current checked page.
543
+	 * @return A {@link String} representing skills available for selection for a given groupType.
544
+	 */
545
+	private String getGroupSkillList(Player player, String groupType, String schemeName, int page)
546
+	{
547
+		// Retrieve the entire skills list based on group type.
548
+		List<Integer> skills = BufferManager.getInstance().getSkillsIdsByType(groupType);
549
+		if (skills.isEmpty())
550
+			return "That group doesn't contain any skills.";
551
+		
552
+		// Calculate page number.
553
+		final int max = MathUtil.countPagesNumber(skills.size(), PAGE_LIMIT);
554
+		if (page > max)
555
+			page = max;
556
+		
557
+		// Cut skills list up to page number.
558
+		skills = skills.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, skills.size()));
559
+		
560
+		final List<Integer> schemeSkills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName);
561
+		final StringBuilder sb = new StringBuilder(skills.size() * 150);
562
+		
563
+		int row = 0;
564
+		for (int skillId : skills)
565
+		{
566
+			final String icon = (skillId < 100) ? "icon.skill00" + skillId : (skillId < 1000) ? "icon.skill0" + skillId : "icon.skill" + skillId;
567
+			
568
+			sb.append(((row % 2) == 0 ? "<table width=\"280\" bgcolor=\"000000\"><tr>" : "<table width=\"280\"><tr>"));
569
+			
570
+			if (schemeSkills.contains(skillId))
571
+				StringUtil.append(sb, "<td height=40 width=40><img src=\"", icon, "\" width=32 height=32></td><td width=190>", SkillTable.getInstance().getInfo(skillId, 1).getName(), "<br1><font color=\"B09878\">", BufferManager.getInstance().getAvailableBuff(skillId).getDescription(), "</font></td><td><button action=\"bypass npc_%objectId%_skillunselect ", groupType, " ", schemeName, " ", skillId, " ", page, "\" width=32 height=32 back=\"L2UI_CH3.mapbutton_zoomout2\" fore=\"L2UI_CH3.mapbutton_zoomout1\"></td>");
572
+			else
573
+				StringUtil.append(sb, "<td height=40 width=40><img src=\"", icon, "\" width=32 height=32></td><td width=190>", SkillTable.getInstance().getInfo(skillId, 1).getName(), "<br1><font color=\"B09878\">", BufferManager.getInstance().getAvailableBuff(skillId).getDescription(), "</font></td><td><button action=\"bypass npc_%objectId%_skillselect ", groupType, " ", schemeName, " ", skillId, " ", page, "\" width=32 height=32 back=\"L2UI_CH3.mapbutton_zoomin2\" fore=\"L2UI_CH3.mapbutton_zoomin1\"></td>");
574
+			
575
+			sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=277 height=1>");
576
+			row++;
577
+		}
578
+		
579
+		for (int i = PAGE_LIMIT; i > row; i--)
580
+			StringUtil.append(sb, "<img height=41>");
581
+		
582
+		// Build page footer.
583
+		sb.append("<br><img src=\"L2UI.SquareGray\" width=277 height=1><table width=\"100%\" bgcolor=000000><tr>");
584
+		
585
+		if (page > 1)
586
+			StringUtil.append(sb, "<td align=left width=70><a action=\"bypass npc_" + getObjectId() + "_editschemes ", groupType, " ", schemeName, " ", page - 1, "\">Previous</a></td>");
587
+		else
588
+			StringUtil.append(sb, "<td align=left width=70>Previous</td>");
589
+		
590
+		StringUtil.append(sb, "<td align=center width=100>Page ", page, "</td>");
591
+		
592
+		if (page < max)
593
+			StringUtil.append(sb, "<td align=right width=70><a action=\"bypass npc_" + getObjectId() + "_editschemes ", groupType, " ", schemeName, " ", page + 1, "\">Next</a></td>");
594
+		else
595
+			StringUtil.append(sb, "<td align=right width=70>Next</td>");
596
+		
597
+		sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=277 height=1>");
598
+		
599
+		return sb.toString();
600
+	}
601
+	
602
+	/**
603
+	 * @param groupType : The group of skills to select.
604
+	 * @param schemeName : The scheme to make check.
605
+	 * @return A {@link String} representing all groupTypes available. The group currently on selection isn't linkable.
606
+	 */
607
+	private static String getTypesFrame(String groupType, String schemeName)
608
+	{
609
+		final StringBuilder sb = new StringBuilder(500);
610
+		sb.append("<table>");
611
+		
612
+		int count = 0;
613
+		for (String type : BufferManager.getInstance().getSkillTypes())
614
+		{
615
+			if (count == 0)
616
+				sb.append("<tr>");
617
+			
618
+			if (groupType.equalsIgnoreCase(type))
619
+				StringUtil.append(sb, "<td width=65>", type, "</td>");
620
+			else
621
+				StringUtil.append(sb, "<td width=65><a action=\"bypass npc_%objectId%_editschemes ", type, " ", schemeName, " 1\">", type, "</a></td>");
622
+			
623
+			count++;
624
+			if (count == 4)
625
+			{
626
+				sb.append("</tr>");
627
+				count = 0;
628
+			}
629
+		}
630
+		
631
+		if (!sb.toString().endsWith("</tr>"))
632
+			sb.append("</tr>");
633
+		
634
+		sb.append("</table>");
635
+		
636
+		return sb.toString();
637
+	}
638
+	
639
+	/**
640
+	 * @param list : A {@link List} of skill ids.
641
+	 * @return a global fee for all skills contained in the {@link List}.
642
+	 */
643
+	private static int getFee(ArrayList<Integer> list)
644
+	{
645
+		if (Config.PBUFFER_STATIC_BUFF_COST > 0)
646
+			return list.size() * Config.PBUFFER_STATIC_BUFF_COST;
647
+		
648
+		int fee = 0;
649
+		for (int sk : list)
650
+			fee += BufferManager.getInstance().getAvailableBuff(sk).getPrice();
651
+		
652
+		return fee;
653
+	}
654
+	
655
+	private void autoBuffFunction(Player player, String bufflist)
656
+	{
657
+		ArrayList<L2Skill> skills_to_buff = new ArrayList<>();
658
+		List<Integer> list = null;
659
+		
660
+		if (bufflist.equalsIgnoreCase("fighter"))
661
+			list = Config.PFIGHTER_SKILL_LIST;
662
+		else if (bufflist.equalsIgnoreCase("mage"))
663
+			list = Config.PMAGE_SKILL_LIST;
664
+		
665
+		if (list != null)
666
+		{
667
+			for (int skillId : list)
668
+			{
669
+				L2Skill skill = SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId));
670
+				if (skill != null)
671
+					skills_to_buff.add(skill);
672
+			}
673
+			
674
+			for (L2Skill sk : skills_to_buff)
675
+				sk.getEffects(player, player);
676
+			
677
+			player.updateEffectIcons();
678
+			
679
+			list = null;
680
+		}
681
+		
682
+		skills_to_buff.clear();
683
+		
684
+		showMainWindow(player);
685
+	}
686
+	
687
+}
688
\ No newline at end of file
689