All pastes #67321 Raw Edit

Mine

public text v1 · immutable
#67321 ·published 2006-06-19 19:26 UTC
rendered paste body
java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java
===================================================================
--- C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java	(revision 2117)
+++ C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java	(working copy)
@@ -22,6 +22,8 @@
 import net.sf.l2j.gameserver.CharTemplateTable;
 import net.sf.l2j.gameserver.ai.CtrlIntention;
 import net.sf.l2j.gameserver.model.base.ClassId;
+import net.sf.l2j.gameserver.model.base.PlayerClass;
+import net.sf.l2j.gameserver.model.base.ClassLevel;
 import net.sf.l2j.gameserver.model.quest.Quest;
 import net.sf.l2j.gameserver.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.serverpackets.MyTargetSelected;
@@ -80,42 +82,17 @@
 
 			int jobLevel = 0;
 			int level = player.getLevel();
-
-			switch (classId)
+            ClassLevel lvl = PlayerClass.values()[classId.getId()].getLevel();  
+            switch (lvl)
 			{
-			case fighter:
-			case mage:
-			case elvenFighter:
-			case elvenMage:
-			case darkFighter:
-			case darkMage:
-			case orcFighter:
-			case orcMage:
-			case dwarvenFighter:
-				jobLevel = 1;
-				break;
-			case elvenScout:
-			case elvenKnight:
-			case elvenWizard:
-			case oracle:
-			case knight:
-			case warrior:
-			case rogue:
-			case wizard:
-			case cleric:
-			case palusKnight:
-			case assassin:
-			case darkWizard:
-			case shillienOracle:
-			case orcRaider:
-			case orcMonk:
-			case orcShaman:
-			case scavenger: 
-			case artisan:
-				jobLevel = 2;
-				break;
-			default:
-				jobLevel = 3;
+                case First:
+                    jobLevel = 1;
+                    break;
+                case Second:
+                    jobLevel = 2;
+                    break;
+                default:
+                    jobLevel = 3;
 			}
 			
 			if (!Config.ALLOW_CLASS_MASTERS) 
@@ -132,16 +109,15 @@
 				{
 					if (classId.getId() == _secondClassIds[i])
 					{
-						changeClass(player, 88+i);
-						player.setBaseClass(player.getActiveClass());
-						player.sendPacket(new SystemMessage(1606));
-						
                         NpcHtmlMessage html = new NpcHtmlMessage(1);
                         StringBuffer sb = new StringBuffer();
-                        sb.append("<html><head><body>");
-                        sb.append("You have now become a <font color=\"LEVEL\">" + CharTemplateTable.getClassNameById(classId.ordinal()) + "</font>.");
-                        sb.append("</body></html>");
-                        
+                        sb.append("<html><body<table width=200>");
+                        sb.append("<tr><td><center>"+CharTemplateTable.getClassNameById(classId.getId())+" Class Master:</center></td></tr>");
+                        sb.append("<tr><td><br></td></tr>");
+                        sb.append("<tr><td><a action=\"bypass -h npc_"+getObjectId()+"_change_class "+(88+i)+"\">Advance to "+CharTemplateTable.getClassNameById(88+i)+"</a></td></tr>");
+                        sb.append("<tr><td><br></td></tr>");
+                        sb.append("<tr><td><a action=\"bypass -h npc_"+getObjectId()+"_upgrade_hatchling\">Upgrade Hatchling to Strider</a></td></tr>");
+                        sb.append("</table></body></html>");
                         html.setHtml(sb.toString());
                         player.sendPacket(html);
                         return;
@@ -187,28 +163,42 @@
 	{
 		if(command.startsWith("change_class"))
 		{
-			int val = Integer.parseInt(command.substring(13));
-			changeClass(player, val);
+            int val = Integer.parseInt(command.substring(13));
+            changeClass(player, val);
             
-            //set base_class = classid after profession change
-            player.setBaseClass(player.getActiveClass());
-        }
-		else 
-		{
-			// this class dont know any other commands, let forward
-			// the command to the parent class
-			
-			super.onBypassFeedback(player, command);
-		}
-	}
+            if(val >= 88)
+            player.sendPacket(new SystemMessage(1606)); // system sound 3rd occupation
+            else
+            player.sendPacket(new SystemMessage(1308));    // system sound for 1st and 2nd occupation
+
+            NpcHtmlMessage html = new NpcHtmlMessage(1);
+            StringBuffer sb = new StringBuffer();
+            sb.append("<html><head><body>");
+            sb.append("You have now become a <font color=\"LEVEL\">" + CharTemplateTable.getClassNameById(player.getClassId().getId()) + "</font>.");
+            sb.append("</body></html>");
+                        
+            html.setHtml(sb.toString());
+            player.sendPacket(html);
+       }
+       else 
+       {
+           super.onBypassFeedback(player, command);
+       }
+ }
 	
 	private void changeClass(L2PcInstance player, int val)
 	{
 		if (Config.DEBUG) _log.fine("Changing class to ClassId:"+val);
-		player.setClassId(val);
-		if (Config.DEBUG) _log.fine("name:"+player.getName());
-		if (Config.DEBUG) _log.fine("level:"+player.getLevel());
-		if (Config.DEBUG) _log.fine("classId:"+player.getClassId());
+        if (player.isSubClassActive())
+        {
+            player.upgradeSubClass(player.getClassIndex(), val);
+            player.setActiveClass(player.getClassIndex());
+        } 
+        else
+        {
+            player.setClassId(val);
+            player.setBaseClass(player.getActiveClass());
+        }
 		player.broadcastUserInfo();
 	}
 }
java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(revision 2117)
+++ C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
@@ -192,6 +192,7 @@
     private static final String RESTORE_CHAR_SUBCLASSES = "SELECT class_id,exp,sp,level,class_index FROM character_subclasses WHERE char_obj_id=? ORDER BY class_index ASC";
     private static final String ADD_CHAR_SUBCLASS = "INSERT INTO character_subclasses (char_obj_id,class_id,exp,sp,level,class_index) VALUES (?,?,?,?,?,?)";
     private static final String UPDATE_CHAR_SUBCLASS = "UPDATE character_subclasses SET exp=?,sp=?,level=? WHERE char_obj_id=? AND class_index =?";
+    private static final String UPDATE_CHAR_SUBCLASS_CLASSID = "UPDATE character_subclasses SET class_id=? WHERE char_obj_id=? AND class_index =?";
     private static final String DELETE_CHAR_SUBCLASS = "DELETE FROM character_subclasses WHERE char_obj_id=? AND class_index=?";
 
 	private static final String RESTORE_CHAR_HENNAS = "SELECT slot,symbol_id FROM character_hennas WHERE char_obj_id=? AND class_index=?";
@@ -7163,6 +7164,52 @@
     }
     
     /**
+     * This method is mainly used to get a 3rd class for a subclass
+     * 1. Replace the subclass at classIndex by the specified class ID.<BR>
+     * 2. This method no longer changes the active _classIndex of the player. This is only
+     * done by the calling of setActiveClass() method as that should be the only way to do so.
+     *
+     * @param int classIndex
+     * @param int newClassId
+     * @return boolean subclassUpgraded
+     */
+    public boolean upgradeSubClass(int classIndex, int newClassId)
+    {
+        if (!getSubClasses().containsKey(classIndex))
+            return false;
+    
+        java.sql.Connection con = null;
+
+        try 
+        {
+            //upgrade info about existing subclass.
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement(UPDATE_CHAR_SUBCLASS_CLASSID);
+            statement.setInt(1, newClassId);
+            statement.setInt(2, getObjectId());
+            statement.setInt(3, classIndex); 
+            statement.execute();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            _log.warning("WARNING: Could not upgrade character sub class for " + getName() + ": " + e);
+            return false;
+        }
+        finally
+        {
+            try { con.close(); } catch (Exception e) {}
+        }
+        
+        getSubClasses().get(classIndex).setClassId(newClassId);
+
+        if (Config.DEBUG)
+            _log.info(getName() + " upgraded sub class at index " + classIndex + " with class ID " + newClassId + ".");
+        
+        return true; 
+    }
+    
+    /**
      * 1. Completely erase all existance of the subClass linked to the classIndex.<BR>
      * 2. Send over the newClassId to addSubClass()to create a new instance on this classIndex.<BR> 
      * 3. Upon Exception, revert the player to their BaseClass to avoid further problems.<BR>
java/net/sf/l2j/gameserver/model/base/PlayerClass.java
===================================================================
--- C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/base/PlayerClass.java	(revision 2117)
+++ C:/Documents and Settings/wajs/workspace/L2_GameServerSVN/java/net/sf/l2j/gameserver/model/base/PlayerClass.java	(working copy)
@@ -233,4 +233,8 @@
     {
         return this.level == pLevel;
     }
+    public final ClassLevel getLevel()
+    {
+        return level;
+    }
 }