Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/config/server.properties =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/config/server.properties (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/config/server.properties (working copy) @@ -18,10 +18,10 @@ GameserverPort=7777 # This is transmitted to the clients connecting from an external network, so it has to be a public IP or resolvable hostname -ExternalHostname=82.28.82.28 +ExternalHostname=68.228.131.231 # This is transmitted to the client from the same network, so it has to be a local IP or resolvable hostname -InternalHostname=192.168.1.100 +InternalHostname=192.168.1.101 # Bind ip of the loginserver, use * to bind on all available IPs @@ -222,6 +222,7 @@ #% regeneration of normal regeneration speed HpRegenMultiplier=100 MpRegenMultiplier=100 +CpRegenMultiplier=100 # ================================================================== # -- KARMA VARS -- Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/Config.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/Config.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/Config.java (working copy) @@ -278,6 +278,7 @@ public static final double HP_REGEN_MULTIPLIER; public static final double MP_REGEN_MULTIPLIER; + public static final double CP_REGEN_MULTIPLIER; public static final int STARTING_ADENA; @@ -481,6 +482,7 @@ /* if different from 100 (ie 100%) heal rate is modified acordingly */ HP_REGEN_MULTIPLIER = (double)Integer.parseInt(serverSettings.getProperty("HpRegenMultiplier", "100")); MP_REGEN_MULTIPLIER = (double)Integer.parseInt(serverSettings.getProperty("MpRegenMultiplier", "100")); + CP_REGEN_MULTIPLIER = (double)Integer.parseInt(serverSettings.getProperty("CpRegenMultiplier", "100")); STARTING_ADENA = Integer.parseInt(serverSettings.getProperty("StartingAdena", "100")); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/LevelUpData.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/LevelUpData.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/LevelUpData.java (working copy) @@ -37,7 +37,7 @@ */ public class LevelUpData { - private static final String SELECT_ALL = "SELECT classid, defaulthpbase, defaulthpadd, defaulthpmod, defaultmpbase, defaultmpadd, defaultmpmod, class_lvl FROM lvlupgain"; + private static final String SELECT_ALL = "SELECT classid, defaulthpbase, defaulthpadd, defaulthpmod, defaultcpbase, defaultcpadd, defaultcpmod, defaultmpbase, defaultmpadd, defaultmpmod, class_lvl FROM lvlupgain"; private static final String CLASS_LVL = "class_lvl"; private static final String MP_MOD = "defaultmpmod"; private static final String MP_ADD = "defaultmpadd"; @@ -45,6 +45,9 @@ private static final String HP_MOD = "defaulthpmod"; private static final String HP_ADD = "defaulthpadd"; private static final String HP_BASE = "defaulthpbase"; + private static final String CP_MOD = "defaultcpmod"; + private static final String CP_ADD = "defaultcpadd"; + private static final String CP_BASE = "defaultcpbase"; private static final String CLASS_ID = "classid"; private static Logger _log = Logger.getLogger(LevelUpData.class.getName()); @@ -80,7 +83,10 @@ lvlDat.set_classLvl(rset.getInt(CLASS_LVL)); lvlDat.set_classHpBase(rset.getFloat(HP_BASE)); lvlDat.set_classHpAdd(rset.getFloat(HP_ADD)); - lvlDat.set_classHpModifier(rset.getFloat(HP_MOD)); + lvlDat.set_classHpModifier(rset.getFloat(HP_MOD)); + lvlDat.set_classCpBase(rset.getFloat(CP_BASE)); + lvlDat.set_classCpAdd(rset.getFloat(CP_ADD)); + lvlDat.set_classCpModifier(rset.getFloat(CP_MOD)); lvlDat.set_classMpBase(rset.getFloat(MP_BASE)); lvlDat.set_classMpAdd(rset.getFloat(MP_ADD)); lvlDat.set_classMpModifier(rset.getFloat(MP_MOD)); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java (working copy) @@ -118,6 +118,7 @@ //newChar.setHairColor(_hairColor); //newChar.setFace(_face); newChar.setCurrentHp(template.baseHpMax); + newChar.setCurrentCp(template.baseCpMax); newChar.setCurrentMp(template.baseMpMax); newChar.setMaxLoad(template.baseLoad); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/DoorTable.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/DoorTable.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/DoorTable.java (working copy) @@ -113,7 +113,8 @@ npcDat.set("sex", "male"); npcDat.set("type", ""); npcDat.set("baseAtkRange", 0); - npcDat.set("baseMpMax",0 ); + npcDat.set("baseMpMax", 0); + npcDat.set("baseCpMax", 0); npcDat.set("revardExp", 0); npcDat.set("revardSp", 0); npcDat.set("basePAtk", 0); @@ -129,6 +130,7 @@ npcDat.set("name", name); npcDat.set("baseHpMax", hp); npcDat.set("baseHpReg", 3.e-3f); + npcDat.set("baseCpReg", 0); npcDat.set("baseMpReg", 3.e-3f); npcDat.set("basePDef", pdef); npcDat.set("baseMDef", mdef); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java (working copy) @@ -2864,10 +2864,12 @@ su.addAttribute(StatusUpdate.LEVEL, _level); su.addAttribute(StatusUpdate.MAX_HP, getMaxHp()); su.addAttribute(StatusUpdate.MAX_MP, getMaxMp()); + su.addAttribute(StatusUpdate.MAX_CP, getMaxCp()); sendPacket(su); // Set the current HP and MP of the L2Character, Launch/Stop a HP/MP/CP Regeneration Task and send StatusUpdate packet to all other L2PcInstance to inform (exclusive broadcast) setCurrentHpMp(getMaxHp(),getMaxMp()); + setCurrentCp(getMaxCp()); // Recalculate the party level if (isInParty()) getParty().recalculatePartyLevel(); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2LvlupData.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2LvlupData.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2LvlupData.java (working copy) @@ -30,7 +30,10 @@ private int _classLvl; private float _classHpAdd; private float _classHpBase; - private float _classHpModifier; + private float _classHpModifier; + private float _classCpAdd; + private float _classCpBase; + private float _classCpModifier; private float _classMpAdd; private float _classMpBase; private float _classMpModifier; @@ -71,6 +74,42 @@ public void set_classHpModifier(float hpModifier) { _classHpModifier = hpModifier; } + /** + * @return Returns the _classCpAdd. + */ + public float get_classCpAdd() { + return _classCpAdd; + } + /** + * @param hpAdd The _classCpAdd to set. + */ + public void set_classCpAdd(float cpAdd) { + _classCpAdd = cpAdd; + } + /** + * @return Returns the _classCpBase. + */ + public float get_classCpBase() { + return _classCpBase; + } + /** + * @param hpBase The _classCpBase to set. + */ + public void set_classCpBase(float cpBase) { + _classCpBase = cpBase; + } + /** + * @return Returns the _classCpModifier. + */ + public float get_classCpModifier() { + return _classCpModifier; + } + /** + * @param cpModifier The _classCpModifier to set. + */ + public void set_classCpModifier(float cpModifier) { + _classCpModifier = cpModifier; + } /** * @return Returns the _classid. */ Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -2069,7 +2069,8 @@ */ public final int getMaxCp() { - return getMaxHp() / 2; + double val = calcStat(Stats.MAX_CP, _template.baseCpMax, null, null); + return (int)val; } /** Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Formulas.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Formulas.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Formulas.java (working copy) @@ -524,6 +524,42 @@ env.value *= CONbonus[p.getCON()]; } } + static class FuncMaxCpAdd extends Func + { + static final FuncMaxCpAdd _fmca_instance = new FuncMaxCpAdd(); + static Func getInstance() { + return _fmca_instance; + } + private FuncMaxCpAdd() + { + super(Stats.MAX_CP, 0x10, null); + } + public void calc(Env env) + { + L2PcTemplate t = (L2PcTemplate)env._player.getTemplate(); + int lvl = env._player.getLevel() - t.classBaseLevel; + double cpmod = t.lvlCpMod * lvl; + double cpmax = (t.lvlCpAdd + cpmod) * lvl; + double cpmin = (t.lvlCpAdd * lvl) + cpmod; + env.value += (cpmax + cpmin) / 2; + } + } + static class FuncMaxCpMul extends Func + { + static final FuncMaxCpMul _fmcm_instance = new FuncMaxCpMul(); + static Func getInstance() { + return _fmcm_instance; + } + private FuncMaxCpMul() + { + super(Stats.MAX_CP, 0x20, null); + } + public void calc(Env env) + { + L2PcInstance p = (L2PcInstance)env._player; + env.value *= CONbonus[p.getCON()]; + } + } static class FuncMaxMpAdd extends Func { static final FuncMaxMpAdd _fmma_instance = new FuncMaxMpAdd(); @@ -630,6 +666,8 @@ { cha.addStatFunc(FuncMaxHpAdd.getInstance()); cha.addStatFunc(FuncMaxHpMul.getInstance()); + cha.addStatFunc(FuncMaxCpAdd.getInstance()); + cha.addStatFunc(FuncMaxCpMul.getInstance()); cha.addStatFunc(FuncMaxMpAdd.getInstance()); cha.addStatFunc(FuncMaxMpMul.getInstance()); cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE)); @@ -657,6 +695,7 @@ else if (cha instanceof L2Summon) { cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_HP_RATE)); + cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_CP_RATE)); cha.addStatFunc(FuncMultRegenResting.getInstance(Stats.REGENERATE_MP_RATE)); cha.addStatFunc(FuncAtkCritical.getInstance()); cha.addStatFunc(FuncAtkAccuracy.getInstance()); @@ -688,8 +727,8 @@ */ public final double calcCpRegen(L2Character cha) { - double init = cha.getMaxHp()*cha.getTemplate().baseHpReg; - return cha.calcStat(Stats.REGENERATE_HP_RATE, init, null, null); + double init = cha.getMaxCp()*cha.getTemplate().baseCpReg * Config.CP_REGEN_MULTIPLIER / 100; + return cha.calcStat(Stats.REGENERATE_CP_RATE, init, null, null); } /** Calculated damage caused by ATTACK of attacker on target, Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Stats.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Stats.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/skills/Stats.java (working copy) @@ -33,7 +33,9 @@ // HP & MP MAX_HP, MAX_MP, + MAX_CP, REGENERATE_HP_RATE, + REGENERATE_CP_RATE, REGENERATE_MP_RATE, // Atk & Def POWER_DEFENCE, @@ -133,8 +135,10 @@ { name = name.intern(); if (name == "maxHp" ) return MAX_HP; + if (name == "maxCp" ) return MAX_CP; if (name == "maxMp" ) return MAX_MP; if (name == "regHp" ) return REGENERATE_HP_RATE; + if (name == "regCp" ) return REGENERATE_CP_RATE; if (name == "regMp" ) return REGENERATE_MP_RATE; if (name == "pDef" ) return POWER_DEFENCE; if (name == "mDef" ) return MAGIC_DEFENCE; Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java (working copy) @@ -32,7 +32,8 @@ public final int baseINT; public final int baseWIT; public final int baseMEN; - public final float baseHpMax; + public final float baseHpMax; + public final float baseCpMax; public final float baseMpMax; /** HP Regen base */ @@ -40,6 +41,9 @@ /** MP Regen base */ public final float baseMpReg; + + /** CP Regen base */ + public final float baseCpReg; public final int basePAtk; public final int baseMAtk; @@ -93,9 +97,11 @@ baseINT = set.getInteger("baseINT"); baseWIT = set.getInteger("baseWIT"); baseMEN = set.getInteger("baseMEN"); - baseHpMax = set.getFloat ("baseHpMax"); + baseHpMax = set.getFloat ("baseHpMax"); + baseCpMax = set.getFloat("baseCpMax"); baseMpMax = set.getFloat ("baseMpMax"); baseHpReg = set.getFloat ("baseHpReg"); + baseCpReg = set.getFloat("baseCpReg"); baseMpReg = set.getFloat ("baseMpReg"); basePAtk = set.getInteger("basePAtk"); baseMAtk = set.getInteger("baseMAtk"); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2PcTemplate.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2PcTemplate.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/templates/L2PcTemplate.java (working copy) @@ -47,7 +47,9 @@ public final int classBaseLevel; public final float lvlHpAdd; - public final float lvlHpMod; + public final float lvlHpMod; + public final float lvlCpAdd; + public final float lvlCpMod; public final float lvlMpAdd; public final float lvlMpMod; @@ -71,6 +73,8 @@ classBaseLevel = set.getInteger("classBaseLevel"); lvlHpAdd = set.getFloat("lvlHpAdd"); lvlHpMod = set.getFloat("lvlHpMod"); + lvlCpAdd = set.getFloat("lvlCpAdd"); + lvlCpMod = set.getFloat("lvlCpMod"); lvlMpAdd = set.getFloat("lvlMpAdd"); lvlMpMod = set.getFloat("lvlMpMod"); } Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/CharTemplateTable.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/CharTemplateTable.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/CharTemplateTable.java (working copy) @@ -82,10 +82,14 @@ set.set("baseHpMax", rset.getFloat("lvlupgain.defaultHpBase")); set.set("lvlHpAdd", rset.getFloat("lvlupgain.defaultHpAdd")); set.set("lvlHpMod", rset.getFloat("lvlupgain.defaultHpMod")); - set.set("baseMpMax", rset.getFloat("lvlupgain.defaultMpBase")); + set.set("baseMpMax", rset.getFloat("lvlupgain.defaultMpBase")); + set.set("baseCpMax", rset.getFloat("lvlupgain.defaultCpBase")); + set.set("lvlCpAdd", rset.getFloat("lvlupgain.defaultCpAdd")); + set.set("lvlCpMod", rset.getFloat("lvlupgain.defaultCpMod")); set.set("lvlMpAdd", rset.getFloat("lvlupgain.defaultMpAdd")); set.set("lvlMpMod", rset.getFloat("lvlupgain.defaultMpMod")); - set.set("baseHpReg", 0.01); + set.set("baseHpReg", 0.01); + set.set("baseCpReg", 0.01); set.set("baseMpReg", 0.01); set.set("basePAtk", rset.getInt("char_templates.p_atk")); set.set("basePDef", /*classId.isMage()? 77 : 129*/ rset.getInt("char_templates.p_def")); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/NpcTable.java =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/NpcTable.java (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/java/net/sf/l2j/gameserver/NpcTable.java (working copy) @@ -222,6 +222,7 @@ npcDat.set("baseRunSpd", NpcData.getInt("runspd")); npcDat.set("baseHpReg", 0.01); + npcDat.set("baseCpReg", 0); npcDat.set("baseMpReg", 0.01); // constants, until we have stats in DB @@ -233,6 +234,7 @@ npcDat.set("baseMEN", NpcData.getInt("men")); npcDat.set("baseHpMax", NpcData.getInt("hp")); + npcDat.set("baseCpMax", 0); npcDat.set("baseMpMax", NpcData.getInt("mp")); npcDat.set("basePAtk", NpcData.getInt("patk")); npcDat.set("basePDef", NpcData.getInt("pdef")); Index: C:/Documents and Settings/Chris/workspace/L2_Gameserver/sql/l2jdb_create.sql =================================================================== --- C:/Documents and Settings/Chris/workspace/L2_Gameserver/sql/l2jdb_create.sql (revision 863) +++ C:/Documents and Settings/Chris/workspace/L2_Gameserver/sql/l2jdb_create.sql (working copy) @@ -319,6 +319,9 @@ defaulthpbase decimal(4,1) , defaulthpadd decimal(3,2) , defaulthpmod decimal(3,2) , + defaultcpbase decimal(4,1) , + defaultcpadd decimal(3,2) , + defaultcpmod decimal(3,2) , defaultmpbase decimal(4,1) , defaultmpadd decimal(3,2) , defaultmpmod decimal(3,2) ,