All pastes #45884 Raw Edit

Untitled

public text v1 · immutable
#45884 ·published 2006-03-16 05:56 UTC
rendered paste body
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/config/server.properties
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/config/server.properties	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/config/server.properties	(working copy)
@@ -112,6 +112,11 @@
 PlayerRateDropEquip = 25
 PlayerRateDropEquipWeapon = 5
 
+# Multiplier for pet rate control (with lower values pet will grow slower)
+PetXpRate = 1
+# Pet Food Rate control, 1 food = PetFoodRate
+PetFoodRate = 1
+
 # Karma Drop Rate control, values are the percent values
 KarmaDropLimit = 10
 KarmaRateDrop = 70
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/Config.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/Config.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/Config.java	(working copy)
@@ -234,6 +234,10 @@
     public static int   PLAYER_RATE_DROP_ITEM;
     public static int   PLAYER_RATE_DROP_EQUIP;    
     public static int   PLAYER_RATE_DROP_EQUIP_WEAPON;    
+    
+	/** Pet Rates (Multipliers) */ 	
+	public static float         PET_XP_RATE; 	
+ 	public static int           PET_FOOD_RATE;
 
     /** Karma Drop Rate control */
     public static int   KARMA_DROP_LIMIT;
@@ -572,6 +576,9 @@
 	            PLAYER_RATE_DROP_ITEM           = Integer.parseInt(serverSettings.getProperty("PlayerRateDropItem", "70"));
 	            PLAYER_RATE_DROP_EQUIP          = Integer.parseInt(serverSettings.getProperty("PlayerRateDropEquip", "25"));
 	            PLAYER_RATE_DROP_EQUIP_WEAPON   = Integer.parseInt(serverSettings.getProperty("PlayerRateDropEquipWeapon", "5"));
+	            
+	            PET_XP_RATE         = Float.parseFloat(serverSettings.getProperty("PetXpRate", "0.5")); 	
+	            PET_FOOD_RATE   = Integer.parseInt(serverSettings.getProperty("PetFoodRate", "100")); 
                 
                 KARMA_DROP_LIMIT               = Integer.parseInt(serverSettings.getProperty("KarmaDropLimit", "10"));
                 KARMA_RATE_DROP                = Integer.parseInt(serverSettings.getProperty("KarmaRateDrop", "70"));
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestPetUseItem.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestPetUseItem.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestPetUseItem.java	(working copy)
@@ -88,23 +88,32 @@
                 return;
 			}
 		}
-		else if ((itemId == 2515) || (itemId == 4038) || (itemId == 5168))
+		else if ((itemId == 2515) || (itemId == 4038) || (itemId == 5168) || (itemId == 6316) || (itemId == 7582))
 		{
 			if (pet.getNpcId() == 12077 && itemId == 2515)
 			{
-				feed(activeChar,pet, item);
+				feed(activeChar, pet, item);
 				return;
 			}
 			else if ((pet.getNpcId() >= 12311 && pet.getNpcId() <= 12313) && itemId == 4038)
 			{
-				feed(activeChar,pet, item);
+				feed(activeChar, pet, item);
 				return;
 			}
 			else if ((pet.getNpcId() >= 12526 && pet.getNpcId() <= 12528) && itemId == 5168)
 			{
-				feed(activeChar,pet, item);
+				feed(activeChar, pet, item);
 				return;
 			}
+			else if (pet.getNpcId() == 12621 && itemId == 6316)
+			{
+				feed(activeChar, pet, item);
+				return;
+			}
+			else if ((pet.getNpcId() >= 12780 && pet.getNpcId() <= 12780) && itemId == 7582)
+			{
+				feed(activeChar, pet, item);
+			}
 		}
 	    IItemHandler handler = ItemHandler.getInstance().getItemHandler(item.getItemId());
 	    if (handler != null)
@@ -148,26 +157,42 @@
 		    }
 		}
 	}
-	private void feed(L2PcInstance player,L2PetInstance pet, L2ItemInstance item)
+
+	/**
+	 * When fed by owner double click on food from pet inventory. <BR><BR>
+	 * 
+	 * <FONT COLOR=#FF0000><B> <U>Caution</U> : 1 food = 100 points of currentFed</B></FONT><BR><BR>
+	 */
+	private void feed(L2PcInstance player, L2PetInstance pet, L2ItemInstance item)
 	{
-
-        if (pet.getMaxFed() <=  pet.getCurrentFed() + item.getCount())
-        {
-            //Not exists message to send in "systemmsg-e.txt"
-            return;
-        }
-        
-		if (pet.getCurrentFed() <= item.getCount())
+		final int items = item.getCount();
+		final int curFed = pet.getCurrentFed();
+		final int maxFed = pet.getMaxFed();
+		
+		// if it's not fed 100%
+		if ( curFed < maxFed )
 		{
-			pet.destroyItem("Feed", item.getObjectId(), item.getCount(), pet, false);
-			pet.setCurrentFed(pet.getCurrentFed() + item.getCount());
+			final int foodNeeded = (int)( ( maxFed - curFed ) / Config.PET_FOOD_RATE);
+			
+			// if pet has food in inventory
+			if ( items > 0 )
+			{
+				// if pet has more food than it needs
+				if ( items > foodNeeded )
+				{
+					// consume only the quantity it needs
+					pet.setCurrentFed( curFed + (int)(foodNeeded * Config.PET_FOOD_RATE) );
+					pet.destroyItem("Feed", item.getObjectId(), foodNeeded, pet, false);
+				}
+				else
+				{
+					// consume all food from inventory
+					pet.setCurrentFed( curFed + (int)(items * Config.PET_FOOD_RATE) );
+					pet.destroyItem("Feed", item.getObjectId(), items, pet, false);
+				}
+			}
+			pet.broadcastStatusUpdate();
 		}
-		else
-		{
-			pet.destroyItem("Feed", item.getObjectId(), pet.getMaxFed() - pet.getCurrentFed(), pet, false);
-			pet.setCurrentFed(pet.getMaxFed());
-		}
-		pet.broadcastStatusUpdate();
 	}
 	
 	/* (non-Javadoc)
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestActionUse.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestActionUse.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/clientpackets/RequestActionUse.java	(working copy)
@@ -32,6 +32,7 @@
 import net.sf.l2j.gameserver.model.L2Summon;
 import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2StaticObjectInstance;
 import net.sf.l2j.gameserver.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.serverpackets.ChairSit;
@@ -121,7 +122,7 @@
 				break;
 			}
             case 21:
-			case 15:
+			case 15: // pet follow/stop
 			{
 				L2Summon pet = activeChar.getPet();
 				if (pet != null)
@@ -129,10 +130,10 @@
 				break;
 			}
             case 22:
-			case 16:
+			case 16: // pet attack
 			{
                 L2Object target = activeChar.getTarget();
-				if (target != null && activeChar.getPet()!=null && activeChar.getPet()!= target && activeChar != target)
+				if (target != null && activeChar.getPet()!= null && activeChar.getPet()!= target && activeChar != target)
 				{
                     if (
                             activeChar.getAccessLevel() < Config.GM_PEACEATTACK &&
@@ -145,7 +146,7 @@
 
                     if (target.isAutoAttackable(activeChar) || _ctrlPressed)
                     {
-                        //activeChar.getPet().startAttack((L2Character)activeChar.getTarget());
+                        // Siege Golem (12251)
                         if ((activeChar.getPet().getNpcId() != 12251) || (activeChar.getTarget() instanceof L2DoorInstance))
                             activeChar.getPet().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, activeChar.getTarget());
                     }
@@ -153,7 +154,7 @@
 				break;
 			}
             case 23:
-			case 17:
+			case 17: // pet - cancel action
 			{
 				L2Summon pet = activeChar.getPet();
 				if (pet != null)
@@ -165,7 +166,7 @@
 				_log.warning("unhandled action type 18");
 				break;
 			}
-			case 19:
+			case 19: // pet unsummon
 			{
 				if (activeChar.getPet()!=null)
 				{
@@ -177,9 +178,22 @@
 					}
 					else
 					{
-					activeChar.getPet().unSummon(activeChar);
+						// if it is a pet and not a summon
+						if (activeChar.getPet().getSummonType() == 2)
+						{
+							L2PetInstance pet = (L2PetInstance)activeChar.getPet();
+							// if the pet is more than 40% fed
+							if ( pet.getCurrentFed() > (pet.getMaxFed() * 0.40) )
+							{
+								activeChar.getPet().unSummon(activeChar);
+							}
+							else
+							{
+								activeChar.sendMessage("Your pet is not fed enough. Cannot unsummon.");
+							}
+						}
+					}
 				}
-				}
 				break;
 			}
 			case 20:
@@ -187,7 +201,7 @@
                 _log.warning("unhandled action type 20");
 				break;
 			}
-			case 38:
+			case 38: // pet mount
 			{
                 L2Summon pet = activeChar.getPet();
 
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PetInstance.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PetInstance.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/instance/L2PetInstance.java	(working copy)
@@ -27,6 +27,7 @@
 import net.sf.l2j.Config;
 import net.sf.l2j.L2DatabaseFactory;
 import net.sf.l2j.gameserver.ClientScheduler;
+import net.sf.l2j.gameserver.SkillTable;
 import net.sf.l2j.gameserver.ai.CtrlIntention;
 import net.sf.l2j.gameserver.idfactory.IdFactory;
 import net.sf.l2j.gameserver.model.actor.stat.PetStat;
@@ -45,14 +46,17 @@
 import net.sf.l2j.gameserver.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.serverpackets.ItemList;
+import net.sf.l2j.gameserver.serverpackets.MagicSkillUser;
 import net.sf.l2j.gameserver.serverpackets.MyTargetSelected;
 import net.sf.l2j.gameserver.serverpackets.PetInventoryUpdate;
 import net.sf.l2j.gameserver.serverpackets.PetItemList;
 import net.sf.l2j.gameserver.serverpackets.PetStatusShow;
+import net.sf.l2j.gameserver.serverpackets.SetupGauge;
 import net.sf.l2j.gameserver.serverpackets.PetStatusUpdate;
 import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.serverpackets.StopMove;
 import net.sf.l2j.gameserver.serverpackets.SystemMessage;
+import net.sf.l2j.gameserver.serverpackets.SocialAction;
 import net.sf.l2j.gameserver.taskmanager.DecayTaskManager;
 import net.sf.l2j.gameserver.templates.L2NpcTemplate;
 import net.sf.l2j.gameserver.templates.L2Weapon;
@@ -77,6 +81,9 @@
 	private boolean _respawned;
 	private Future _feedTask;
     private boolean _mountable;
+    
+    private int _feedTime;
+    private boolean _feedMode;
 	
 	private L2PetData _Data;
     public final L2PetData getPetData()
@@ -86,6 +93,16 @@
     }
     public final void setPetData(L2PetData value) { _Data = value; }
 	
+    /**
+     * Manage Feeding Task.<BR><BR>
+     * 
+     * <B><U> Actions</U> :</B><BR>
+     * <li>Feed or kill the pet depending on hunger level</li>
+     * <li>If pet has food in inventory and feed level drops below 55% then consume food from inventory</li> 
+     * <li>Send a broadcastStatusUpdate packet for this L2PetInstance</li><BR><BR>
+     * 
+     */
+    
 	class FeedTask implements Runnable
 	{
 		
@@ -93,13 +110,34 @@
 		{
 			try
 			{
-				if(getCurrentFed() > 0)
+				// if pet is attacking
+				if ( isAttackingNow() )
+				{
+					// if its not already on battleFeed mode
+					if ( !_feedMode )
+					{
+						startFeed( true ); //switching to battle feed
+					}
+				}
+				else
+				{
+					startFeed( false ); // normal feed
+				}
+				
+				if ( getCurrentFed() > 0 )
+				{
+					// eat
 					setCurrentFed(getCurrentFed() - 1);
+				}
 				else
 				{
+					// go back to pet control item, or simply said, unsummon it lol
 					setCurrentFed(0);
-					doDie(null);
+					stopFeed();
+					unSummon(getOwner());
+					getOwner().sendMessage("Your pet is too hungry to stay summoned.");
 				}
+				
 				L2ItemInstance food = null;
 				switch (getTemplate().npcId)
 				{
@@ -131,6 +169,18 @@
 					case 12528:
 						food = getInventory().getItemByItemId(5168);
 						break;	
+					// Baby buffalo
+					case 12780:
+						food = getInventory().getItemByItemId(7582);
+						break;
+					// Baby kookaburra
+					case 12781:
+						food = getInventory().getItemByItemId(7582);
+						break;
+					// Baby cougar
+					case 12782:
+						food = getInventory().getItemByItemId(7582);
+						break;
 					// unknown npc id.. should never happen
 					default:
 						return; 
@@ -138,7 +188,7 @@
 				if(food != null && getCurrentFed() < (0.55 * getMaxFed()))
 				{
 					if(destroyItem("Feed", food.getObjectId(), 1, null, false))
-						setCurrentFed(getCurrentFed() + 1);
+						setCurrentFed( getCurrentFed() + (int)(1 * Config.PET_FOOD_RATE) );
 				}
 				broadcastStatusUpdate();
 			}
@@ -656,20 +706,27 @@
 		}
 	}
 	
-	public synchronized void startFeed()
+	public synchronized void startFeed( boolean battleFeed )
 	{
+		// stop feeding task if its active
+		if (_feedTask != null) { stopFeed(); }
+		
 	    if (_feedTask == null && !isDead())
         {
-	        if (Config.DEBUG) _log.fine("Feed task started");
-	        int time;
-	        time = getStat().getFeedNormal();
-	        //time = getStat().getFeedBattle();
-	        if (time >= 0)
+	    	if (battleFeed)
 	        {
-	            _log.warning("Pet Feed Normal Time is 0. Changing time to 1 to bypass divide by 0");
-	            time = 1;
+	    		_feedMode = true;
+	    		_feedTime = _Data.getPetFeedBattle();
 	        }
-	        _feedTask = ClientScheduler.getInstance().scheduleMedAtFixedRate(new FeedTask(), 60000/time, 60000/time);
+	    	else
+	    	{
+	    		_feedMode = false;
+	    		_feedTime = _Data.getPetFeedNormal();
+	    	}
+	    	// pet feed time must be different than 0. Changing time to bypass divide by 0
+	    	if (_feedTime <= 0) { _feedTime = 1; }
+	    	
+	    	_feedTask = ClientScheduler.getInstance().scheduleMedAtFixedRate(new FeedTask(), 60000/_feedTime, 60000/_feedTime);
 	    }
 	}
 	
@@ -693,8 +750,6 @@
         getStat().addExp(-lostExp);
      }
 
-
-    
     public void addExpAndSp(int addToExp, int addToSp) { getStat().addExpAndSp(addToExp, addToSp); }
     public int getExpForThisLevel() { return getStat().getExpForLevel(getLevel()); }
     public int getExpForNextLevel() { return getStat().getExpForLevel(getLevel() + 1); }
@@ -702,6 +757,12 @@
     public void reduceCurrentHp(double value, L2Character attacker, boolean awake) { getStatus().reduceHp(value, attacker, awake); }
     public final int getLevel() { return getStat().getLevel(); }
     public int getMaxFed() { return getStat().getMaxFeed(); }
+    public int getAccuracy() { return getStat().getAccuracy(); }
+    public int getCriticalHit(L2Character target, L2Skill skill) { return getStat().getCriticalHit(target, skill); }
+    public int getEvasionRate(L2Character target) { return getStat().getEvasionRate(target); }
+    public int getRunSpeed() { return getStat().getRunSpeed(); }
+    public int getPAtkSpd() { return getStat().getPAtkSpd(); }
+    public int getMAtkSpd() { return getStat().getMAtkSpd(); }
     public int getMAtk(L2Character target, L2Skill skill) { return getStat().getMAtk(target, skill); }
     public int getMDef(L2Character target, L2Skill skill) { return getStat().getMDef(target, skill); }
     public int getPAtk(L2Character target) { return getStat().getPAtk(target); }
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/PetStat.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/PetStat.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/PetStat.java	(working copy)
@@ -69,7 +69,7 @@
         return levelIncreased;
     }
 
-    public final int getExpForLevel(int level) { return L2PetDataTable.getInstance().getPetData(getActiveChar().getNpcId(), level).getPetExp(); }
+    public final int getExpForLevel(int level) { return L2PetDataTable.getInstance().getPetData(getActiveChar().getNpcId(), level).getPetMaxExp(); }
     
     // =========================================================
     // Method - Private
@@ -90,14 +90,14 @@
 
         getActiveChar().setPetData(L2PetDataTable.getInstance().getPetData(getActiveChar().getTemplate().npcId, getLevel()));
 
-        getActiveChar().startFeed();
+        getActiveChar().startFeed( false );
     }
 
     public final int getMaxFeed() { return (int)getActiveChar().getPetData().getPetMaxFeed(); }
 
-    public int getMaxHp() { return (int)calcStat(Stats.MAX_HP, getActiveChar().getPetData().getPetHP(), null, null); }
+    public int getMaxHp() { return (int)calcStat(Stats.MAX_HP, getActiveChar().getPetData().getPetMaxHP(), null, null); }
     
-    public int getMaxMp() { return (int)calcStat(Stats.MAX_MP, getActiveChar().getPetData().getPetMP(), null, null); }
+    public int getMaxMp() { return (int)calcStat(Stats.MAX_MP, getActiveChar().getPetData().getPetMaxMP(), null, null); }
     
     public int getMAtk(L2Character target, L2Skill skill)
     {
@@ -155,6 +155,14 @@
     }
     
     public int getPAtk(L2Character target) { return (int)calcStat(Stats.POWER_ATTACK, getActiveChar().getPetData().getPetPAtk(), target, null); }
+    public int getPDef(L2Character target) { return (int)calcStat(Stats.POWER_DEFENCE, getActiveChar().getPetData().getPetPDef(), target, null); }
+    public int getAccuracy() { return getActiveChar().getPetData().getPetAccuracy(); }
+    public int getCriticalHit(L2Character target, L2Skill skill) { return getActiveChar().getPetData().getPetCritical(); }
+    public int getEvasionRate(L2Character target) { return getActiveChar().getPetData().getPetEvasion(); }
+    public int getRunSpeed() { return getActiveChar().getPetData().getPetSpeed(); }
+    public int getPAtkSpd() { return getActiveChar().getPetData().getPetAtkSpeed(); }
+    public int getMAtkSpd() { return getActiveChar().getPetData().getPetCastSpeed(); }
     
-    public int getPDef(L2Character target) { return (int)calcStat(Stats.POWER_DEFENCE, getActiveChar().getPetData().getPetPDef(), target, null); }
+    
+
 }
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java	(working copy)
@@ -94,7 +94,7 @@
     // =========================================================
     // Property - Public
     /** Return the Accuracy (base+modifier) of the L2Character in function of the Weapon Expertise Penalty. */
-    public final int getAccuracy() { return (int)(calcStat(Stats.ACCURACY_COMBAT, 0, null, null) / getActiveChar().getWeaponExpertisePenalty()); }
+    public int getAccuracy() { return (int)(calcStat(Stats.ACCURACY_COMBAT, 0, null, null) / getActiveChar().getWeaponExpertisePenalty()); }
 
     public L2Character getActiveChar()
     {
@@ -115,13 +115,13 @@
     public final double getCriticalDmg(L2Character target, double init) { return calcStat(Stats.CRITICAL_DAMAGE, init, target, null); }
 
     /** Return the Critical Hit rate (base+modifier) of the L2Character. */
-    public final int getCriticalHit(L2Character target, L2Skill skill) { return (int)calcStat(Stats.CRITICAL_RATE, getActiveChar().getTemplate().baseCritRate, target, skill); }
+    public int getCriticalHit(L2Character target, L2Skill skill) { return (int)calcStat(Stats.CRITICAL_RATE, getActiveChar().getTemplate().baseCritRate, target, skill); }
 
     /** Return the DEX of the L2Character (base+modifier). */
     public final int getDEX() { return (int)calcStat(Stats.STAT_DEX, getActiveChar().getTemplate().baseDEX, null, null); }
 
     /** Return the Attack Evasion rate (base+modifier) of the L2Character. */
-    public final int getEvasionRate(L2Character target) { return (int)(calcStat(Stats.EVASION_RATE, 0, target, null) / getActiveChar().getArmourExpertisePenalty()); }
+    public int getEvasionRate(L2Character target) { return (int)(calcStat(Stats.EVASION_RATE, 0, target, null) / getActiveChar().getArmourExpertisePenalty()); }
 
     public int getExp() { return _Exp; }
     public void setExp(int value) { _Exp = value; }
@@ -192,7 +192,7 @@
     }
 
     /** Return the MAtk Speed (base+modifier) of the L2Character in function of the Armour Expertise Penalty. */
-    public final int getMAtkSpd()
+    public int getMAtkSpd()
     {
         double val = calcStat(Stats.MAGIC_ATTACK_SPEED, getActiveChar().getTemplate().baseMAtkSpd, null, null);
         val /= getActiveChar().getArmourExpertisePenalty();
@@ -299,7 +299,7 @@
     public final double getPAtkPlants(L2Character target) { return calcStat(Stats.PATK_PLANTS, 1, target, null); }
     
     /** Return the PAtk Speed (base+modifier) of the L2Character in function of the Armour Expertise Penalty. */
-    public final int getPAtkSpd() { return (int)(calcStat(Stats.POWER_ATTACK_SPEED, getActiveChar().getTemplate().basePAtkSpd, null, null) / getActiveChar().getArmourExpertisePenalty()); }
+    public int getPAtkSpd() { return (int)(calcStat(Stats.POWER_ATTACK_SPEED, getActiveChar().getTemplate().basePAtkSpd, null, null) / getActiveChar().getArmourExpertisePenalty()); }
 
     /** Return the PAtk Modifier against undead. */
     public final double getPAtkUndead(L2Character target) { return calcStat(Stats.PATK_UNDEAD, 1, target, null); }
@@ -315,7 +315,7 @@
     public final double getReuseModifier(L2Character target) { return calcStat(Stats.ATK_REUSE, 1, target, null); }
     
     /** Return the RunSpeed (base+modifier) of the L2Character in function of the Armour Expertise Penalty. */
-    public final int getRunSpeed()
+    public int getRunSpeed()
     {
         // err we should be adding TO the persons run speed
         // not making it a constant
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetDataTable.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetDataTable.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetDataTable.java	(working copy)
@@ -20,11 +20,19 @@
 
 import java.util.Collection;
 import java.util.Map;
-
+import net.sf.l2j.L2DatabaseFactory;
+import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet; 
+import java.util.logging.Logger;
 import javolution.util.FastMap;
 
 public class L2PetDataTable
 {
+	protected static Logger _log = Logger.getLogger(L2PetInstance.class.getName()); 
+	
+	private static final int[] petList = { 12077, 12312, 12313, 12311, 12527, 12528, 12526 };
+	
     private static L2PetDataTable _instance;
     
     private static Map<Integer, Map<Integer, L2PetData>> petTable;
@@ -43,6 +51,80 @@
         petTable = new FastMap<Integer, Map<Integer, L2PetData>>();
     }
     
+    public void loadPetsData() 
+    { 
+        for (int i = 0; i < petList.length; i++) 
+        { 
+                int pet = petList[i]; 
+                 
+                L2PetData[] petLevelsList = new L2PetData[81]; 
+                 
+                for (int level = 1; level <= 81; level++) 
+                { 
+                         
+                        petLevelsList[level - 1] = new L2PetData(); 
+                        petLevelsList[level - 1].setPetID(pet); 
+                        petLevelsList[level - 1].setPetLevel(level); 
+                         
+                        //System.out.println( "  " + petLevelsList[level - 1].getPetID() + " - " + petLevelsList[level - 1].getPetLevel() ); 
+                // here starts the SQL thingie 
+                java.sql.Connection conStats = null; 
+                         
+                        try 
+                        {        
+                                conStats = L2DatabaseFactory.getInstance().getConnection();                              
+                                 
+                                PreparedStatement statementStats = conStats.prepareStatement("SELECT expMax, hpMax, mpMax, patk, pdef, matk, mdef, acc, evasion, crit, speed, atk_speed, cast_speed, feedMax, feedbattle, feednormal, loadMax, hpregen, mpregen FROM pets_stats WHERE typeID=? AND level=?"); 
+ 
+                                statementStats.setInt(1, pet ); 
+                                statementStats.setInt(2, level ); 
+                                 
+                                ResultSet rsetStats = statementStats.executeQuery(); 
+ 
+                                if (!rsetStats.next()) { return; } 
+ 
+                                //reading sql
+                                //petLevelsList[level - 1].setPetID(pet); 
+                                //petLevelsList[level - 1].setPetLevel(level); 
+                                //petLevelsList[level - 1].setPetExp( -1 ); 
+                                petLevelsList[level - 1].setPetMaxExp( rsetStats.getInt("expMax") ); 
+                                //petLevelsList[level - 1].setPetMaxHP( -1 ); 
+                                petLevelsList[level - 1].setPetMaxHP( rsetStats.getInt("hpMax") ); 
+                                //petLevelsList[level - 1].setPetMaxMP( -1 );                            
+                                petLevelsList[level - 1].setPetMaxMP( rsetStats.getInt("mpMax") ); 
+                                petLevelsList[level - 1].setPetPAtk( rsetStats.getInt("patk") ); 
+                                petLevelsList[level - 1].setPetPDef( rsetStats.getInt("pdef") ); 
+                                petLevelsList[level - 1].setPetMAtk( rsetStats.getInt("matk") ); 
+                                petLevelsList[level - 1].setPetMDef( rsetStats.getInt("mdef") ); 
+                                petLevelsList[level - 1].setPetAccuracy( rsetStats.getInt("acc") ); 
+                                petLevelsList[level - 1].setPetEvasion( rsetStats.getInt("evasion") ); 
+                                petLevelsList[level - 1].setPetCritical( rsetStats.getInt("crit") ); 
+                                petLevelsList[level - 1].setPetSpeed( rsetStats.getInt("speed") ); 
+                                petLevelsList[level - 1].setPetAtkSpeed( rsetStats.getInt("atk_speed") ); 
+                                petLevelsList[level - 1].setPetCastSpeed( rsetStats.getInt("cast_speed") ); 
+                                //petLevelsList[level - 1].setPetFeed( -1 ); 
+                                petLevelsList[level - 1].setPetMaxFeed( rsetStats.getInt("feedMax") ); 
+                                petLevelsList[level - 1].setPetFeedNormal( rsetStats.getInt("feednormal") ); 
+                                petLevelsList[level - 1].setPetFeedBattle( rsetStats.getInt("feedbattle") ); 
+                                //petLevelsList[level - 1].setPetLoad( -1 ); 
+                                petLevelsList[level - 1].setPetMaxLoad( rsetStats.getInt("loadMax") ); 
+                                petLevelsList[level - 1].setPetRegenHP( rsetStats.getInt("hpregen") ); 
+                                petLevelsList[level - 1].setPetRegenMP( rsetStats.getInt("mpregen") ); 
+ 
+                                rsetStats.close(); 
+                                statementStats.close(); 
+                                 
+                        } catch (Exception e) { 
+                                _log.warning("Could not load pets stats: "+ e);                          
+                        } finally { 
+                                try { conStats.close(); } catch (Exception e) {} 
+                        } 
+                } 
+                 
+                L2PetDataTable.getInstance().addPetData(petLevelsList); 
+        } 
+    } 
+    
     public void addPetData(L2PetData petData)
     {
         //System.out.println("looking if hashmap for id "+petData.getPetID()+" created");
@@ -65,7 +147,7 @@
         }
         
     }
-    
+    /*
     public void addPetData(Collection<L2PetData> list)
     {
         for (L2PetData petData : list)
@@ -82,8 +164,14 @@
             //if (petData.getPetLevel() == 35)System.out.println(getPetData(petData.getPetID(), petData.getPetLevel()));
             //if (list[i].getPetLevel() == 35)System.out.println(list[i].getPetID()+" "+ list[i].getPetLevel());
             //if (list[i].getPetLevel() == 35)System.out.println(getPetData(list[i].getPetID(), list[i].getPetLevel()).getPetExp());
+             */
+    
+    public void addPetData(L2PetData[] petLevelsList) 
+    {
+    	for (int i = 0; i < petLevelsList.length; i++) 
+    	{
+    		addPetData(petLevelsList[i]);
         }
-        //System.out.println(getPetData(12311, 35).getPetExp());
     }
     
     public L2PetData getPetData(int petID, int petLevel)
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetData.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetData.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PetData.java	(working copy)
@@ -20,242 +20,220 @@
 
 public class L2PetData
 {
-    public static final String PET_MAX_FEED     = "MaxFeed";
-    public static final String PET_FEED_BATTLE  = "FeedBattle";
-    public static final String PET_FEED_NORMAL  = "FeedNormal";
-    public static final String PET_PATK         = "PAtk";
-    public static final String PET_PDEF         = "PDef";
-    public static final String PET_MATK         = "MAtk";
-    public static final String PET_MDEF         = "MDef";
-    public static final String PET_HP           = "HP";
-    public static final String PET_MP           = "MP";
-    public static final String PET_REGEN_HP     = "RegenHP";
-    public static final String PET_REGEN_MP     = "RegenMP";
-    public static final String PET_EXP          = "Exp";
+    public static final String PET_TYPE        = "typeID"; 
+    public static final String PET_LEVEL        = "level";  
+//  public static final String PET_EXP              = "exp"; 
+    public static final String PET_MAX_EXP      = "expMax"; 
+//  public static final String PET_HP           = "hp";      
+    public static final String PET_MAX_HP       = "hpMax"; 
+//  public static final String PET_MP               = "mp";  
+    public static final String PET_MAX_MP       = "mpMax";           
+    public static final String PET_PATK         = "patk";        
+    public static final String PET_PDEF         = "pdef";        
+    public static final String PET_MATK         = "matk";        
+    public static final String PET_MDEF         = "mdef";        
+    public static final String PET_ACCURACY     = "acc";    
+    public static final String PET_EVASION      = "evasion";     
+    public static final String PET_CRITICAL     = "crit";    
+    public static final String PET_SPEED        = "speed";       
+    public static final String PET_ATK_SPEED    = "atk_speed";           
+    public static final String PET_CAST_SPEED   = "cast_speed"; 
+//  public static final String PET_FEED                 = "feed";  
+    public static final String PET_MAX_FEED     = "feedMax";         
+    public static final String PET_FEED_BATTLE  = "feedbattle"; 
+    public static final String PET_FEED_NORMAL  = "feednormal"; 
+//  public static final String PET_LOAD                 = "load";  
+    public static final String PET_MAX_LOAD     = "loadMax";  
+    public static final String PET_REGEN_HP     = "hpregen"; 
+    public static final String PET_REGEN_MP     = "mpregen";
+
     
     private int petID;
     private int petLevel;
+//  private int petExp; 
+    private int petMaxExp; 
+//    private int petHP; 
+    private int petMaxHP; 
+//    private int petMP;         
+    private int petMaxMP;     
+    private int petPAtk; 
+    private int petPDef; 
+    private int petMAtk; 
+    private int petMDef;     
+    private int petAccuracy;     
+    private int petEvasion;      
+    private int petCritical;     
+    private int petSpeed;        
+    private int petAtkSpeed;     
+	private int petCastSpeed; 
+//      private int petFeed; 
     private int petMaxFeed;
     private int petFeedBattle;
     private int petFeedNormal;
-    private int petPAtk;
-    private int petPDef;
-    private int petMAtk;
-    private int petMDef;
-    private int petHP;
-    private int petMP;
+    private int petMaxLoad;
     private int petRegenHP;
     private int petRegenMP;
-    private int petExp;
     
     public void setStat(String stat, int value)
     {
-        if (stat.equalsIgnoreCase(PET_MAX_FEED))
-        {
-            this.setPetMaxFeed(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_FEED_BATTLE))
-        {
-            this.setPetFeedBattle(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_FEED_NORMAL))
-        {
-            this.setPetFeedNormal(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_PATK))
-        {
-            this.setPetPAtk(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_PDEF))
-        {
-            this.setPetPDef(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_MATK))
-        {
-            this.setPetMAtk(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_MDEF))
-        {
-            this.setPetMDef(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_HP))
-        {
-            this.setPetHP(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_MP))
-        {
-            this.setPetMP(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_REGEN_HP))
-        {
-            this.setPetRegenHP(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_REGEN_MP))
-        {
-            this.setPetRegenMP(value);
-        }
-        else if (stat.equalsIgnoreCase(PET_EXP))
-        {
-            this.setPetExp(value);
-        }
+//      if (stat.equalsIgnoreCase(PET_EXP)) { this.setPetExp(value); } 
+        if (stat.equalsIgnoreCase(PET_MAX_EXP)) { this.setPetMaxExp(value); } 
+//        else if (stat.equalsIgnoreCase(PET_HP)) { this.setPetHP(value); } 
+        else if (stat.equalsIgnoreCase(PET_MAX_HP)) { this.setPetMaxHP(value); } 
+//        else if (stat.equalsIgnoreCase(PET_MP)) { this.setPetMP(value); } 
+        else if (stat.equalsIgnoreCase(PET_MAX_MP)) { this.setPetMaxMP(value); } 
+        else if (stat.equalsIgnoreCase(PET_PATK)) { this.setPetPAtk(value); } 
+        else if (stat.equalsIgnoreCase(PET_PDEF)) { this.setPetPDef(value); } 
+        else if (stat.equalsIgnoreCase(PET_MATK)) { this.setPetMAtk(value); } 
+        else if (stat.equalsIgnoreCase(PET_MDEF)) { this.setPetMDef(value); } 
+        else if (stat.equalsIgnoreCase(PET_ACCURACY)) { this.setPetAccuracy(value); } 
+        else if (stat.equalsIgnoreCase(PET_EVASION)) { this.setPetEvasion(value); } 
+        else if (stat.equalsIgnoreCase(PET_CRITICAL)) { this.setPetCritical(value); } 
+        else if (stat.equalsIgnoreCase(PET_SPEED)) { this.setPetSpeed(value); } 
+        else if (stat.equalsIgnoreCase(PET_ATK_SPEED)) { this.setPetAtkSpeed(value); } 
+        else if (stat.equalsIgnoreCase(PET_CAST_SPEED)) { this.setPetCastSpeed(value); } 
+//        else if (stat.equalsIgnoreCase(PET_FEED)) { this.setPetFeed(value); }          
+        else if (stat.equalsIgnoreCase(PET_MAX_FEED)) { this.setPetMaxFeed(value); } 
+        else if (stat.equalsIgnoreCase(PET_FEED_NORMAL)) { this.setPetFeedNormal(value); }       
+        else if (stat.equalsIgnoreCase(PET_FEED_BATTLE)) { this.setPetFeedBattle(value); } 
+//        else if (stat.equalsIgnoreCase(PET_LOAD)) { this.setPetLoad(value); } 
+        else if (stat.equalsIgnoreCase(PET_MAX_LOAD)) { this.setPetMaxLoad(value); } 
+        else if (stat.equalsIgnoreCase(PET_REGEN_HP)) { this.setPetRegenHP(value); } 
+        else if (stat.equalsIgnoreCase(PET_REGEN_MP)) { this.setPetRegenMP(value); } 
     }
     
-    public int getPetFeedBattle()
-    {
-        return petFeedBattle;
-    }
+//  ID   
+    public int getPetID() { return petID; }     
+    public void setPetID(int petID) { this.petID = petID; } 
+     
+//  Level   
+    public int getPetLevel() { return petLevel; } 
+    public void setPetLevel(int petLevel) { this.petLevel = petLevel; } 
+     
+//  Exp     
+//    public int getPetExp() { return petExp; }     
+//    public void setPetExp(int petExp) { this.petExp = petExp; } 
+ 
+//  Max Exp     
+    public int getPetMaxExp() { return petMaxExp; }     
+    public void setPetMaxExp(int petMaxExp) { this.petMaxExp = petMaxExp; }     
+     
+//  HP     
+//    public int getPetHP() { return petHP; }     
+//    public void setPetHP(int petHP) { this.petHP = petHP; } 
+ 
+//  Max HP     
+    public int getPetMaxHP() { return petMaxHP; }     
+    public void setPetMaxHP(int petMaxHP) { this.petMaxHP = petMaxHP; }     
+     
+//  Mp     
+//    public int getPetMP() { return petMP; } 
+//    public void setPetMP(int petMP) { this.petMP = petMP; } 
+     
+//  Max Mp     
+    public int getPetMaxMP() { return petMaxMP; } 
+    public void setPetMaxMP(int petMaxMP) { this.petMaxMP = petMaxMP; } 
+ 
+//  PAtk     
+    public int getPetPAtk() { return petPAtk; } 
+    public void setPetPAtk(int petPAtk) { this.petPAtk = petPAtk; } 
+ 
+//  PDef     
+    public int getPetPDef() { return petPDef;} 
+    public void setPetPDef(int petPDef) { this.petPDef = petPDef; } 
+     
+//  MAtk   
+    public int getPetMAtk(){ return petMAtk; } 
+    public void setPetMAtk(int petMAtk){ this.petMAtk = petMAtk; } 
+ 
+//  MDef 
+    public int getPetMDef() { return petMDef; } 
+    public void setPetMDef(int petMDef) { this.petMDef = petMDef; } 
+     
+//  Accuracy 
+    public int getPetAccuracy() { return petAccuracy; } 
+    public void setPetAccuracy(int petAccuracy) { this.petAccuracy = petAccuracy; } 
+         
+//  Evasion 
+    public int getPetEvasion() { return petEvasion; } 
+    public void setPetEvasion(int petEvasion) { this.petEvasion = petEvasion; } 
+     
+//  Critical 
+    public int getPetCritical() { return petCritical; } 
+    public void setPetCritical(int petCritical) { this.petCritical = petCritical; } 
+     
+//  Speed 
+    public int getPetSpeed() { return petSpeed; } 
+    public void setPetSpeed(int petSpeed) { this.petSpeed = petSpeed; } 
+     
+//  Atk Speed 
+    public int getPetAtkSpeed() { return petAtkSpeed; } 
+    public void setPetAtkSpeed(int petAtkSpeed) { this.petAtkSpeed = petAtkSpeed; } 
+     
+//  Cast Speed 
+    public int getPetCastSpeed() { return petCastSpeed; } 
+    public void setPetCastSpeed(int petCastSpeed) { this.petCastSpeed = petCastSpeed; } 
+ 
+//  Feed     
+//    public int getPetFeed(){ return petFeed; } 
+//    public void setPetFeed(int petFeed) { this.petFeed = petFeed; } 
+ 
+//  MaxFeed     
+    public int getPetMaxFeed(){ return petMaxFeed; } 
+    public void setPetMaxFeed(int petMaxFeed) { this.petMaxFeed = petMaxFeed; } 
+ 
+//  Normal Feed 
+    public int getPetFeedNormal() { return petFeedNormal; }     
+    public void setPetFeedNormal(int petFeedNormal) { this.petFeedNormal = petFeedNormal; } 
+     
+//  Battle Feed 
+    public int getPetFeedBattle() { return petFeedBattle; } 
+    public void setPetFeedBattle(int petFeedBattle) { this.petFeedBattle = petFeedBattle; }     
+     
+//  Load     
+//    public int getPetLoad() { return petLoad; } 
+//    public void setPetLoad(int petLoad) { this.petLoad = petLoad; } 
+     
+//  Max Load     
+    public int getPetMaxLoad() { return petMaxLoad; } 
+    public void setPetMaxLoad(int petMaxLoad) { this.petMaxLoad = petMaxLoad; } 
+     
+//  Regen HP     
+    public int getPetRegenHP() { return petRegenHP; } 
+    public void setPetRegenHP(int petRegenHP){ this.petRegenHP = petRegenHP;} 
+ 
+//  Regen MP     
+    public int getPetRegenMP() { return petRegenMP; } 
+    public void setPetRegenMP(int petRegenMP) { this.petRegenMP = petRegenMP; } 
     
-    public void setPetFeedBattle(int petFeedBattle)
-    {
-        this.petFeedBattle = petFeedBattle;
-    }
-    
-    public int getPetFeedNormal()
-    {
-        return petFeedNormal;
-    }
-    
-    public void setPetFeedNormal(int petFeedNormal)
-    {
-        this.petFeedNormal = petFeedNormal;
-    }
-    
-    public int getPetHP()
-    {
-        return petHP;
-    }
-    
-    public void setPetHP(int petHP)
-    {
-        this.petHP = petHP;
-    }
-    
-    public int getPetID()
-    {
-        return petID;
-    }
-    
-    public void setPetID(int petID)
-    {
-        this.petID = petID;
-    }
-    
-    public int getPetLevel()
-    {
-        return petLevel;
-    }
-    
-    public void setPetLevel(int petLevel)
-    {
-        this.petLevel = petLevel;
-    }
-    
-    public int getPetMAtk()
-    {
-        return petMAtk;
-    }
-    
-    public void setPetMAtk(int petMAtk)
-    {
-        this.petMAtk = petMAtk;
-    }
-    
-    public int getPetMaxFeed()
-    {
-        return petMaxFeed;
-    }
-    
-    public void setPetMaxFeed(int petMaxFeed)
-    {
-        this.petMaxFeed = petMaxFeed;
-    }
-    
-    public int getPetMDef()
-    {
-        return petMDef;
-    }
-    
-    public void setPetMDef(int petMDef)
-    {
-        this.petMDef = petMDef;
-    }
-    
-    public int getPetExp()
-    {
-        return petExp;
-    }
-    
-    public void setPetExp(int petExp)
-    {
-        this.petExp = petExp;
-    }
-    
-    public int getPetMP()
-    {
-        return petMP;
-    }
-    
-    public void setPetMP(int petMP)
-    {
-        this.petMP = petMP;
-    }
-    
-    public int getPetPAtk()
-    {
-        return petPAtk;
-    }
-    
-    public void setPetPAtk(int petPAtk)
-    {
-        this.petPAtk = petPAtk;
-    }
-    
-    public int getPetPDef()
-    {
-        return petPDef;
-    }
-    
-    public void setPetPDef(int petPDef)
-    {
-        this.petPDef = petPDef;
-    }
-    
-    public int getPetRegenHP()
-    {
-        return petRegenHP;
-    }
-    
-    public void setPetRegenHP(int petRegenHP)
-    {
-        this.petRegenHP = petRegenHP;
-    }
-    
-    public int getPetRegenMP()
-    {
-        return petRegenMP;
-    }
-    
-    public void setPetRegenMP(int petRegenMP)
-    {
-        this.petRegenMP = petRegenMP;
-    }
-    
     public String toString()
     {
-        return "PetID: " + getPetID() + "\t" +
-            "PetLevel: " + getPetLevel() + "\t" +
-            PET_MAX_FEED + ": " + getPetMaxFeed() + "\t" +
-            PET_FEED_BATTLE + ": " + getPetFeedBattle() + "\t" +
-            PET_FEED_NORMAL + ": " + getPetFeedNormal() + "\t" +
-            PET_PATK + ": " + getPetPAtk() + "\t" +
-            PET_PDEF + ": " + getPetPDef() + "\t" +
-            PET_MATK + ": " + getPetMAtk() + "\t" +
-            PET_MDEF + ": " + getPetMDef() + "\t" +
-            PET_HP + ": " + getPetHP() + "\t" +
-            PET_MP + ": " + getPetMP() + "\t" +
-            PET_REGEN_HP + ": " + getPetRegenHP() + "\t" +
-            PET_REGEN_MP + ": " + getPetRegenMP() + "\t" +
-            PET_EXP + ": " + getPetExp();
+        return "PetID: " + getPetID() + " \t" + 
+        "PetLevel: " + getPetLevel() + " \t" + 
+//        PET_EXP + ": " + getPetExp() + " \t" + 
+        PET_MAX_EXP + ": " + getPetMaxExp() + " \t" + 
+//        PET_HP + ": " + getPetHP() + " \t" + 
+        PET_MAX_HP + ": " + getPetMaxHP() + " \t" + 
+//        PET_MP + ": " + getPetMP() + " \t" + 
+        PET_MAX_MP + ": " + getPetMaxMP() + " \t" + 
+        PET_PATK + ": " + getPetPAtk() + " \t" + 
+        PET_PDEF + ": " + getPetPDef() + " \t" + 
+        PET_MATK + ": " + getPetMAtk() + " \t" + 
+        PET_MDEF + ": " + getPetMDef() + " \t" + 
+        PET_ACCURACY + ": " + getPetAccuracy() + " \t" + 
+        PET_EVASION + ": " + getPetEvasion() + " \t" + 
+        PET_CRITICAL + ": " + getPetCritical() + " \t" + 
+        PET_SPEED + ": " + getPetSpeed() + " \t" + 
+        PET_ATK_SPEED + ": " + getPetAtkSpeed() + " \t" +    
+        PET_CAST_SPEED + ": " + getPetCastSpeed() + " \t" + 
+//        PET_FEED + ": " + getPetFeed() + " \t" +             
+        PET_MAX_FEED + ": " + getPetMaxFeed() + " \t" + 
+        PET_FEED_BATTLE + ": " + getPetFeedBattle() + " \t" + 
+        PET_FEED_NORMAL + ": " + getPetFeedNormal() + " \t" + 
+//        PET_LOAD + ": " + getPetLoad() + " \t" + 
+        PET_MAX_LOAD + ": " + getPetMaxLoad() + " \t" + 
+        PET_REGEN_HP + ": " + getPetRegenHP() + " \t" + 
+        PET_REGEN_MP + ": " + getPetRegenMP(); 
     }
     
 }
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java	(working copy)
@@ -4462,19 +4462,19 @@
    public final double calcStat(Stats stat, double init, L2Character target, L2Skill skill) { return getStat().calcStat(stat, init, target, skill); }
 
    // Property - Public
-   public final int getAccuracy() { return getStat().getAccuracy(); }
+   public int getAccuracy() { return getStat().getAccuracy(); }
    public final float getAttackSpeedMultiplier() { return getStat().getAttackSpeedMultiplier(); }
    public final int getAtkCancel() { return getStat().getAtkCancel(); }
    public int getCON() { return getStat().getCON(); }
    public int getDEX() { return getStat().getDEX(); }
    public final double getCriticalDmg(L2Character target, double init) { return getStat().getCriticalDmg(target, init); }
-   public final int getCriticalHit(L2Character target, L2Skill skill) { return getStat().getCriticalHit(target, skill); }
-   public final int getEvasionRate(L2Character target) { return getStat().getEvasionRate(target); }
+   public int getCriticalHit(L2Character target, L2Skill skill) { return getStat().getCriticalHit(target, skill); }
+   public int getEvasionRate(L2Character target) { return getStat().getEvasionRate(target); }
    public int getINT() { return getStat().getINT(); }
    public final int getMagicalAttackRange(L2Skill skill) { return getStat().getMagicalAttackRange(skill); }
    public final int getMaxCp() { return getStat().getMaxCp(); }
    public int getMAtk(L2Character target, L2Skill skill) { return getStat().getMAtk(target, skill); }
-   public final int getMAtkSpd() { return getStat().getMAtkSpd(); }
+   public int getMAtkSpd() { return getStat().getMAtkSpd(); }
    public int getMaxMp() { return getStat().getMaxMp(); }
    public int getMaxHp() { return getStat().getMaxHp(); }
    public final int getMCriticalHit(L2Character target, L2Skill skill) { return getStat().getMCriticalHit(target, skill); }
@@ -4493,7 +4493,7 @@
    public double getPDefUndead(L2Character target) { return getStat().getPDefUndead(target); }
    public int getPDef(L2Character target) { return getStat().getPDef(target); }
    public final int getPhysicalAttackRange() { return getStat().getPhysicalAttackRange(); }
-   public final int getRunSpeed() { return getStat().getRunSpeed(); }
+   public int getRunSpeed() { return getStat().getRunSpeed(); }
    public final int getShldDef() { return getStat().getShldDef(); }
    public int getSTR() { return getStat().getSTR(); }
    public final int getWalkSpeed() { return getStat().getWalkSpeed(); }
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/handler/itemhandlers/PetSummon.java	(working copy)
@@ -60,9 +60,15 @@
 		
 		if (activeChar.getPet() != null)
 		{
-			if (Config.DEBUG) _log.fine("player has a pet already. ignore use item");
+			activeChar.sendMessage("You already have a pet summoned.");
 			return;
 		}
+		
+		if ( activeChar.isAttackingNow() )
+		{
+			activeChar.sendMessage("You cannot summon a pet during combat.");
+			return;
+		}
         
         if (activeChar.isMounted())
             return;
@@ -155,12 +161,57 @@
 		newpet.spawnMe(activeChar.getX()+50, activeChar.getY()+100, activeChar.getZ());
         PetInfo pInfo = new PetInfo(newpet);
         activeChar.sendPacket(pInfo);
-		newpet.startFeed();
+		newpet.startFeed( false );
 		
 		// continue execution in 1 seconds
 		ClientScheduler.getInstance().scheduleLow(new SummonFinalizer(activeChar, newpet), 900);
+		
+		// if pet died of hunger last time it was summoned
+		if ( newpet.getCurrentFed() <= 0 )
+		{
+			// wait 1 minute for owner to feed
+			ClientScheduler.getInstance().scheduleLow(new FeedWait(activeChar, newpet), 60000);
+		}
+		else
+		{
+			// start normal feeding
+			newpet.startFeed( false );
+		}
 	}
 	
+	static class FeedWait implements Runnable
+	{
+		private L2PcInstance _activeChar;
+		private L2PetInstance _newpet;
+		
+		FeedWait(L2PcInstance activeChar, L2PetInstance newpet)
+		{
+			_activeChar = activeChar;
+			_newpet = newpet;
+		}
+		
+		public void run()
+		{
+			try
+			{
+				// owner didn't feed on time
+				if ( _newpet.getCurrentFed() <= 0 )
+				{
+					_newpet.unSummon(_activeChar);
+				}
+				else
+				{
+					// normal feeding
+					_newpet.startFeed( false );
+				}
+			}
+			catch (Throwable e)
+			{
+				_log.severe(e.toString());
+			}
+		}
+	}
+	
 	static class SummonFinalizer implements Runnable
 	{
 		private L2PcInstance _activeChar;
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/GameServer.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/GameServer.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/GameServer.java	(working copy)
@@ -141,7 +141,7 @@
 import net.sf.l2j.gameserver.model.AutoChatHandler;
 import net.sf.l2j.gameserver.model.AutoSpawnHandler;
 import net.sf.l2j.gameserver.model.L2World;
-import net.sf.l2j.gameserver.script.faenor.FaenorScriptEngine;
+import net.sf.l2j.gameserver.model.L2PetDataTable;
 import net.sf.l2j.gameserver.taskmanager.TaskManager;
 import net.sf.l2j.status.Status;
 
@@ -406,7 +406,8 @@
         
 		GmListTable.getInstance();
 
-        FaenorScriptEngine.getInstance();
+        // read pet stats from db
+        L2PetDataTable.getInstance().loadPetsData(); 
 
         Universe.getInstance();
 
Index: E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/script/faenor/FaenorInterface.java
===================================================================
--- E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/script/faenor/FaenorInterface.java	(revision 1610)
+++ E:/workspace enigma/l2jc4/trunk/L2_Gameserver/java/net/sf/l2j/gameserver/script/faenor/FaenorInterface.java	(working copy)
@@ -28,7 +28,6 @@
 import net.sf.l2j.gameserver.EventDroplist;
 import net.sf.l2j.gameserver.model.L2DropData;
 import net.sf.l2j.gameserver.model.L2PetData;
-import net.sf.l2j.gameserver.model.L2PetDataTable;
 import net.sf.l2j.gameserver.script.DateRange;
 import net.sf.l2j.gameserver.script.EngineInterface;
 import net.sf.l2j.gameserver.script.Expression;
@@ -166,7 +165,6 @@
 	        context.undeclareBean("level");
         }
 
-        L2PetDataTable.getInstance().addPetData(petData);
     }
 
 }