Kaynağa Gözat

BETA: Skill Transfer feature fixes.
* Moved out from custom package.
* Added new package for features that are not quests, instances, AIs nor events.
* Replaced `QuestState` and global variables with player variables.
* Included query to migrate old system.
* Removed `onAdvEvent(..)` and timers.

Reported by: CostyKiller, Sdw, d!g0, valanths1990

Zoey76 11 yıl önce
ebeveyn
işleme
f13d493048

+ 3 - 1
L2J_DataPack_BETA/dist/game/data/scripts.cfg

@@ -312,13 +312,15 @@ quests/660_AidingtheFloranVillage/__init__.py
 quests/663_SeductiveWhispers/__init__.py
 quests/999_T1Tutorial/__init__.py
 
+# Features
+features/SkillTransfer/SkillTransfer.java
+
 # Custom
 custom/EchoCrystals/EchoCrystals.java
 custom/ShadowWeapons/ShadowWeapons.java
 custom/NewbieCoupons/NewbieCoupons.java
 custom/RaidbossInfo/RaidbossInfo.java
 custom/NpcLocationInfo/NpcLocationInfo.java
-custom/Validators/SkillTransferValidator.java
 custom/Validators/SubClassSkills.java
 
 # Custom Events

+ 0 - 154
L2J_DataPack_BETA/dist/game/data/scripts/custom/Validators/SkillTransferValidator.java

@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2004-2014 L2J DataPack
- * 
- * This file is part of L2J DataPack.
- * 
- * L2J DataPack is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J DataPack is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package custom.Validators;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.ClassListData;
-import com.l2jserver.gameserver.datatables.SkillTreesData;
-import com.l2jserver.gameserver.enums.IllegalActionPunishmentType;
-import com.l2jserver.gameserver.model.L2SkillLearn;
-import com.l2jserver.gameserver.model.PcCondOverride;
-import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.holders.ItemHolder;
-import com.l2jserver.gameserver.model.quest.QuestState;
-import com.l2jserver.gameserver.model.skills.Skill;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ProfessionChangeEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
-import com.l2jserver.gameserver.util.Util;
-
-/**
- * Skill Transfer validator.
- * @author Zoey76
- */
-public final class SkillTransferValidator extends L2Script
-{
-	private static final ItemHolder[] PORMANDERS =
-	{
-		// Cardinal (97)
-		new ItemHolder(15307, 1),
-		// Eva's Saint (105)
-		new ItemHolder(15308, 1),
-		// Shillen Saint (112)
-		new ItemHolder(15309, 4)
-	};
-	
-	private SkillTransferValidator()
-	{
-		// TODO rewrite to use actual class name
-		super(-1, "SkillTransfer", "custom");
-		setOnEnterWorld(true);
-	}
-	
-	@Override
-	public String onEnterWorld(L2PcInstance player)
-	{
-		if (getTransferClassIndex(player) >= 0)
-		{
-			addProfessionChangeNotify(player);
-			startQuestTimer("givePormanders", 2000, null, player);
-		}
-		return null;
-	}
-	
-	@Override
-	public void onProfessionChange(ProfessionChangeEvent event)
-	{
-		startQuestTimer("givePormanders", 2000, null, event.getPlayer());
-	}
-	
-	@Override
-	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
-	{
-		if (event.equals("givePormanders"))
-		{
-			final int index = getTransferClassIndex(player);
-			if (index >= 0)
-			{
-				QuestState st = player.getQuestState(getName());
-				if (st == null)
-				{
-					st = newQuestState(player);
-				}
-				
-				final String name = getName() + String.valueOf(player.getClassId().getId());
-				if (st.getInt(name) == 0)
-				{
-					st.setInternal(name, "1");
-					if (st.getGlobalQuestVar(name).isEmpty())
-					{
-						st.saveGlobalQuestVar(name, "1");
-						player.addItem(getName(), PORMANDERS[index].getId(), PORMANDERS[index].getCount(), null, true);
-					}
-				}
-				
-				if (Config.SKILL_CHECK_ENABLE && (!player.canOverrideCond(PcCondOverride.SKILL_CONDITIONS) || Config.SKILL_CHECK_GM))
-				{
-					long count = PORMANDERS[index].getCount() - player.getInventory().getInventoryItemCount(PORMANDERS[index].getId(), -1, false);
-					for (Skill sk : player.getAllSkills())
-					{
-						for (L2SkillLearn s : SkillTreesData.getInstance().getTransferSkillTree(player.getClassId()).values())
-						{
-							if (s.getSkillId() == sk.getId())
-							{
-								// Holy Weapon allowed for Shilien Saint/Inquisitor stance
-								if ((sk.getId() == 1043) && (index == 2) && player.isInStance())
-								{
-									continue;
-								}
-								
-								count--;
-								if (count < 0)
-								{
-									final String className = ClassListData.getInstance().getClass(player.getClassId()).getClassName();
-									Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " has too many transfered skills or items, skill:" + s.getName() + " (" + sk.getId() + "/" + sk.getLevel() + "), class:" + className, IllegalActionPunishmentType.BROADCAST);
-									if (Config.SKILL_CHECK_REMOVE)
-									{
-										player.removeSkill(sk);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	private int getTransferClassIndex(L2PcInstance player)
-	{
-		switch (player.getClassId().getId())
-		{
-			case 97: // Cardinal
-				return 0;
-			case 105: // Eva's Saint
-				return 1;
-			case 112: // Shillien Saint
-				return 2;
-			default:
-				return -1;
-		}
-	}
-	
-	public static void main(String[] args)
-	{
-		new SkillTransferValidator();
-	}
-}

+ 143 - 0
L2J_DataPack_BETA/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java

@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2004-2014 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package features.SkillTransfer;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ClassListData;
+import com.l2jserver.gameserver.datatables.SkillTreesData;
+import com.l2jserver.gameserver.enums.IllegalActionPunishmentType;
+import com.l2jserver.gameserver.model.L2SkillLearn;
+import com.l2jserver.gameserver.model.PcCondOverride;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.ItemHolder;
+import com.l2jserver.gameserver.model.skills.Skill;
+import com.l2jserver.gameserver.scripting.scriptengine.events.ProfessionChangeEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ * Skill Transfer feature.
+ * @author Zoey76
+ */
+public final class SkillTransfer extends L2Script
+{
+	private static final String HOLY_POMANDER = "HOLY_POMANDER_";
+	private static final ItemHolder[] PORMANDERS =
+	{
+		// Cardinal (97)
+		new ItemHolder(15307, 1),
+		// Eva's Saint (105)
+		new ItemHolder(15308, 1),
+		// Shillen Saint (112)
+		new ItemHolder(15309, 4)
+	};
+	
+	private SkillTransfer()
+	{
+		super(-1, SkillTransfer.class.getSimpleName(), "features");
+		addProfessionChangeNotify(null);
+		setOnEnterWorld(Config.SKILL_CHECK_ENABLE);
+	}
+	
+	@Override
+	public void onProfessionChange(ProfessionChangeEvent event)
+	{
+		final L2PcInstance player = event.getPlayer();
+		final int index = getTransferClassIndex(player);
+		if (index < 0)
+		{
+			return;
+		}
+		
+		final String name = HOLY_POMANDER + player.getClassId().getId();
+		if (!player.getVariables().getBoolean(name, false))
+		{
+			player.getVariables().set(name, true);
+			giveItems(player, PORMANDERS[index]);
+		}
+	}
+	
+	@Override
+	public String onEnterWorld(L2PcInstance player)
+	{
+		if (!player.canOverrideCond(PcCondOverride.SKILL_CONDITIONS) || Config.SKILL_CHECK_GM)
+		{
+			final int index = getTransferClassIndex(player);
+			if (index < 0)
+			{
+				return super.onEnterWorld(player);
+			}
+			long count = PORMANDERS[index].getCount() - player.getInventory().getInventoryItemCount(PORMANDERS[index].getId(), -1, false);
+			for (Skill sk : player.getAllSkills())
+			{
+				for (L2SkillLearn s : SkillTreesData.getInstance().getTransferSkillTree(player.getClassId()).values())
+				{
+					if (s.getSkillId() == sk.getId())
+					{
+						// Holy Weapon allowed for Shilien Saint/Inquisitor stance
+						if ((sk.getId() == 1043) && (index == 2) && player.isInStance())
+						{
+							continue;
+						}
+						
+						count--;
+						if (count < 0)
+						{
+							final String className = ClassListData.getInstance().getClass(player.getClassId()).getClassName();
+							Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " has too many transfered skills or items, skill:" + s.getName() + " (" + sk.getId() + "/" + sk.getLevel() + "), class:" + className, IllegalActionPunishmentType.BROADCAST);
+							if (Config.SKILL_CHECK_REMOVE)
+							{
+								player.removeSkill(sk);
+							}
+						}
+					}
+				}
+			}
+		}
+		return super.onEnterWorld(player);
+	}
+	
+	private static int getTransferClassIndex(L2PcInstance player)
+	{
+		switch (player.getClassId())
+		{
+			case cardinal:
+			{
+				return 0;
+			}
+			case evaSaint:
+			{
+				return 1;
+			}
+			case shillienSaint:
+			{
+				return 2;
+			}
+			default:
+			{
+				return -1;
+			}
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new SkillTransfer();
+	}
+}

+ 2 - 0
L2J_DataPack_BETA/dist/sql/game/updates/20140418.sql

@@ -0,0 +1,2 @@
+INSERT INTO character_variables (charId, var, val) SELECT charId, REPLACE(var, 'SkillTransfer', 'HOLY_POMANDER_') AS var, 'true' AS val FROM character_quest_global_data WHERE var LIKE "SkillTransfer%";
+DELETE FROM character_quest_global_data WHERE var LIKE "SkillTransfer%";