Page 1 of 2

Vital Jam fix

PostPosted: Sun Jun 01, 2008 7:31 pm
by Blah4
Small (and temporary?) fix for stamina stuff:
in extrafunctions.cpp, find:
  1.        case 312://Food
  2.         {
  3.             useitem->usescript = 1;
  4.             useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[0];
  5.             useitem->usevalue = UseList.Index[useitem->itemnum]->useeffect[1];
  6.         }

and replace it with
  1.        case 312://Food
  2.         {
  3.             if( useitem->itemnum>55 && useitem->itemnum<61)//If it is Vital Jam
  4.             {
  5.                 int restore = 0;
  6.                 if( useitem->itemnum==56 )//Vital Jam +1
  7.                 {
  8.                     restore = 100;
  9.                 }
  10.                 else
  11.                 if( useitem->itemnum==57 )//Vital Jam +2
  12.                 {
  13.                     restore = 200;
  14.                 }
  15.                 else
  16.                 if( useitem->itemnum==58 )//Vital Jam +5
  17.                 {
  18.                     restore = 500;
  19.                 }
  20.                 else
  21.                 if( useitem->itemnum==59 )//Vital Jam +10
  22.                 {
  23.                     restore = 1000;
  24.                 }
  25.                 else
  26.                 if( useitem->itemnum==60 )//Vital Jam +20
  27.                 {
  28.                     restore = 2000;
  29.                 }
  30.                 if((thisclient->CharInfo->stamina) + restore >= 5000)//In case the maximum stamina gets exceeded
  31.                 {
  32.                     thisclient->CharInfo->stamina = 5000;
  33.                 }
  34.                 else
  35.                 {
  36.                     thisclient->CharInfo->stamina += restore;//And restore!
  37.                 }
  38.             }
  39.             useitem->usescript = 1;
  40.             useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[0];
  41.             useitem->usevalue = UseList.Index[useitem->itemnum]->useeffect[1];
  42.         }


Simple solution, guess there is a better one but it works anyway.

Re: Vital Jam fix

PostPosted: Mon Jun 02, 2008 1:32 pm
by pepu
Upload this fix to the svn if u can please.

Re: Vital Jam fix

PostPosted: Mon Jun 02, 2008 2:47 pm
by PurpleYouko
This fix is actually in the wrong place in the code.
Putting it here would make an instant change to the value rather than treating it in the way that it should be done.

here is the way it works

this code
  1.  
  2. case 311://Medicine
  3.         case 312://Food
  4.         {
  5.             useitem->usescript = 1;
  6.             useitem->usetype = UseList.Index[useitem->itemnum]->useeffect[0];
  7.             useitem->usevalue = UseList.Index[useitem->itemnum]->useeffect[1];
  8.         }

Returns the values that you need to change Stamina and even SP (if you used a mana jam)
For a vital jam UseList.Index[useitem->itemnum]->useeffect[0] is 76
for a mana jam UseList.Index[useitem->itemnum]->useeffect[0] is 37

These values are taken back to PakUseItem in WorldPackets.cpp where values are assigned to the "thisclient->useditems" structure.
this bit of code
  1.  
  2. case 1: // Food
  3.         {
  4.             thisclient->UsedItem->usevalue = thisuse->usevalue;
  5.             thisclient->UsedItem->usetype = thisuse->usetype;
  6.             thisclient->UsedItem->userate = 15;
  7.             thisclient->UsedItem->used = 0;
  8.             BEGINPACKET( pak,0x7a3 );
  9.             ADDWORD    ( pak, thisclient->clientid );
  10.             ADDWORD    ( pak, thisuse->itemnum );
  11.             SendToVisible( &pak, thisclient );
  12.             flag = true;
  13.         }

(which incidentally is wrong since it uses brackets inside the switch structure. Un-necessary but won't break the code)
puts the values for usevalue and usetype into the structure.
Still no actual changes though. that is done elsewhere.

The bit where we actually change the values of our HP or MP is in bool CPlayer::PlayerHeal() in Playerfunctions.cpp so that is where the fix should be applied.

here is the code for the function as it stands.
  1. // Heal Player when use Food/Pots
  2. bool CPlayer::PlayerHeal()
  3. {
  4.     clock_t transtime = clock() - UsedItem->lastRegTime;
  5.     if( UsedItem->usevalue!=0 && transtime >= 0.3*CLOCKS_PER_SEC )  
  6.     {          
  7.         if( UsedItem->used < UsedItem->usevalue && Stats->HP > 0 )
  8.         {
  9.             int value = UsedItem->userate;                
  10.             if((UsedItem->usevalue - UsedItem->used) < value)
  11.             {
  12.                 value = UsedItem->usevalue - UsedItem->used;
  13.             }
  14.             switch( UsedItem->usetype )
  15.             {
  16.                 case 16: // HP
  17.                     Stats->HP += value;
  18.                     if(Stats->HP > GetMaxHP())
  19.                         Stats->HP = GetMaxHP();                            
  20.                 break;
  21.                 case 17: // MP
  22.                     Stats->MP += value;                    
  23.                     if(Stats->MP > GetMaxMP())
  24.                         Stats->MP = GetMaxMP();                        
  25.                 break;
  26.             }
  27.             UsedItem->used += value;
  28.             UsedItem->lastRegTime = clock();            
  29.         }
  30.         else
  31.         {
  32.             BEGINPACKET( pak,0x7b7 );
  33.             ADDWORD    ( pak, clientid );
  34.             ADDDWORD   ( pak, GServer->BuildBuffs( this ) );
  35.             switch( UsedItem->usetype )
  36.             {
  37.                 case 16: // HP
  38.                     ADDWORD( pak, Stats->HP );                        
  39.                 break;
  40.                 case 17: // MP
  41.                     ADDWORD( pak, Stats->MP );                    
  42.                 break;
  43.             }
  44.             GServer->SendToVisible( &pak, this );
  45.             UsedItem->used = 0;
  46.             UsedItem->usevalue = 0;
  47.             UsedItem->userate = 0;
  48.             UsedItem->usetype = 0;
  49.         }
  50.     }
  51.     return true;
  52. }

All we need to do is add two new cases to each switch. One for 76 and one for 37
it should look like this (not totally certain about the paks that i added though :? )
  1.  
  2. // Heal Player when use Food/Pots
  3. bool CPlayer::PlayerHeal()
  4. {
  5.     clock_t transtime = clock() - UsedItem->lastRegTime;
  6.     if( UsedItem->usevalue!=0 && transtime >= 0.3*CLOCKS_PER_SEC )  
  7.     {          
  8.         if( UsedItem->used < UsedItem->usevalue && Stats->HP > 0 )
  9.         {
  10.             int value = UsedItem->userate;                
  11.             if((UsedItem->usevalue - UsedItem->used) < value)
  12.             {
  13.                 value = UsedItem->usevalue - UsedItem->used;
  14.             }
  15.             switch( UsedItem->usetype )
  16.             {
  17.                 case 16: // HP
  18.                     Stats->HP += value;
  19.                     if(Stats->HP > GetMaxHP())
  20.                         Stats->HP = GetMaxHP();                            
  21.                 break;
  22.                 case 17: // MP
  23.                     Stats->MP += value;                    
  24.                     if(Stats->MP > GetMaxMP())
  25.                         Stats->MP = GetMaxMP();                        
  26.                 break;
  27.                 case 37: // Skill points
  28.                     CharInfo->SkillPoints += value;
  29.                 break;
  30.                 case 76: //Stamina
  31.                     CharInfo->stamina += value;
  32.                     if(CharInfo->stamina > 5000)
  33.                         CharInfo->stamina = 5000;
  34.                 break;
  35.             }
  36.             UsedItem->used += value;
  37.             UsedItem->lastRegTime = clock();            
  38.         }
  39.         else
  40.         {
  41.             BEGINPACKET( pak,0x7b7 );
  42.             ADDWORD    ( pak, clientid );
  43.             ADDDWORD   ( pak, GServer->BuildBuffs( this ) );
  44.             switch( UsedItem->usetype )
  45.             {
  46.                 case 16: // HP
  47.                     ADDWORD( pak, Stats->HP );                        
  48.                 break;
  49.                 case 17: // MP
  50.                     ADDWORD( pak, Stats->MP );                    
  51.                 break;
  52.                 case 37: //Skill Points
  53.                     ADDWORD( pak, CharInfo->SkillPoints );
  54.                 break;
  55.                 case 76: //Stamina
  56.                     ADDWORD( pak, CharInfo->stamina );
  57.                 break;
  58.             }
  59.             GServer->SendToVisible( &pak, this );
  60.             UsedItem->used = 0;
  61.             UsedItem->usevalue = 0;
  62.             UsedItem->userate = 0;
  63.             UsedItem->usetype = 0;
  64.         }
  65.     }
  66.     return true;
  67. }

Re: Vital Jam fix

PostPosted: Mon Jun 02, 2008 7:09 pm
by Blah4
I don't get your point, Vital Jam is instant restore...

But I guess your one is better though.

Re: Vital Jam fix

PostPosted: Mon Jun 02, 2008 7:20 pm
by Drakia
It is an instant restore, but it has a cooldown time (As do all food items) so you need to implement it like the others so that cooldown is applied.

Re: Vital Jam fix

PostPosted: Mon Jun 02, 2008 7:41 pm
by PurpleYouko
I just tested my code and it does indeed give extra SP when you use a mana jam :D
Strangely though, When i summoned a pet choropie from a capsule my Stamina went down to 4000 then when i used a vital jam +1 (100 stamina) it jumped all the way back up to 5000

Something isn't being handled properly in the server I think.
Maybe we are not actually charging stamina points for summoning at server side then when we add stamina back on we are already at max so the packet sent includes a value of 5000.

Re: Vital Jam fix

PostPosted: Tue Jun 03, 2008 12:42 am
by Blackdpd
this was already bugged on irose..
the same as using the blood charms etc the stamina does not go down and when you relog its 4000
( normally when you kill a mob you get stamina )
but you dont get anything when you kill a mob plus that when you use a vital jam doesn not matter wich one it wil go to 5000 and then it does not go down anymore untill you relog.

Blackdpd `

Re: Vital Jam fix

PostPosted: Tue Jun 03, 2008 1:52 am
by Drakia
Right now the only thing in the code that takes Stamina is summoning a mob using an item. You might want to check the STB for the vital jam, see what it's values are for restoring, it might not have the right value in the STB.

Re: Vital Jam fix

PostPosted: Tue Jun 03, 2008 1:57 pm
by PurpleYouko
The STB is where I got the data from.
A Vital Jam +1 is restoring type 76 (stamina) by a value of 100.

I will add some stamina stuff on the server side today to see if i can get this working properly. Shouldn't bee too hard.
I will also add stamina into the /mystat structure in the GM commands for easy checking.

Re: Vital Jam fix

PostPosted: Tue Jun 03, 2008 7:09 pm
by Blah4
Shouldn't dance scroll be a party-stamina restore item?