PenUltima Online Forum Index Official Core: 096.7
Official Core: 097 2008-02-26
Donate towards the POL web hosting bill!
 POL Home   FAQ   Search    Memberlist   Usergroups    Register    Profile   Log in to check your private messages   Log in
Displaying Damage above Mobs on POL 095/096

 
Post new topic   Reply to topic    PenUltima Online Forum Index -> POL Guides
Display posts from previous:   

Author Message
MuadDib
POL Developer


Joined: 13 Feb 2006
Posts: 830
Location: Indiana, USA

PostPosted: Fri Jun 30, 2006 11:05 am    Post subject: Displaying Damage above Mobs on POL 095/096 Reply with quote

Displaying Damage Dealt Above Mobs In AOS Clients
Pre-ML Style in 095!
After a 4 page post on the old forums, I decided to make this quick and simple guide. This is based of 095 Distro, so be sure to change where you put this as needed (if you are not using distro, you should know where it goes then).

Remember, this is based off the older AOS method for displaying damage, and the 095 core's way of handling this. Hope to post a 096 version, with the new style method for displaying damages soon!

In the file /pkg/systems/combat/hitScriptInc.inc add these 2 functions:

Code:

// ***************************************************


function DisplayDamage(attacker, damaged, dmg)


  if(dmg <= 255)
    var pkt := "BF000B002201SSSSSSSSDD";
    pkt["SSSSSSSS"] := fixPacketLength( (Hex(damaged.serial)-"0x"), 4) ;
    pkt["DD"] := fixPacketLength( (Hex(dmg)-"0x"), 1);
  if(attacker.acct)
    SendPacket(attacker, pkt);
  endif
  if(damaged.acct)
    SendPacket(damaged, pkt);
  endif


endfunction


///////////////////////////////////////////////////////////////
//Pads a string with a "0" prefix, until it is of proper length
//  packetString   value to pad.
//  byteLength     number of bytes. Byte counted as two chars.
///////////////////////////////////////////////////////////////
function fixPacketLength( packetString, byteLength )
    if( !packetString || packetString == error )
        packetString := 0;
    endif
    packetString := cStr(packetString);


    if( packetString[1,2] == "0x" )
        packetString := cStr(packetString[3,len(packetString)]);
    endif


    if( len(packetString) > byteLength * 2 )
//      var extraBytes := (byteLength*2) - len(packetString);
      var extraBytes := len(packetString) - (byteLength*2) + 1;
      return cStr(packetString[extraBytes,len(packetString)]);
    endif


    while( len(packetString) < byteLength * 2 )
        packetString := "0" + packetString;
    endwhile


    return packetString;
endfunction


// ***************************************************


Now, in the function DealDamage, after the line that Sends the ApplyRawDamage, add the following:

Code:

// ***************************************************

set_critical(1);
DisplayDamage(attacker, defender, rawdamage);

// ***************************************************


If you do this, you might want to edit DealDamage()'s function. For Example, this would be the recommended change:

Code:

// ***************************************************
//Original
function DealDamage(defender, attacker, rawdamage, weapon)

// New
function DealDamage(defender, attacker, rawdamage, weapon:=0)
if(weapon)
rawdamage := rawdamage + RandomInt( (GetEffectiveSkill(attacker, 1) ) / 20);
endif

// ***************************************************


Now, the catch is you will want to call the DisplayDamage whereever damage is dealt in other systems too. For instance, like the Spells, or in other scripts that would send damage to the players.

Remember, you send it to both the attacker and the defender. DisplayDamage will see if there is a need to send it (aka, if it's a mob or item then no need).

The easiest way to achieve this being sent always, is to search your scripts to find the damage commands and update them with hitScriptInc.inc and use DealDamage instead. Below is a list of all the core's damage giving commands to replace.

ApplyDamage
ApplyRawDamage

I think those are all anyway. Could be wrong

Then, in the scripts that are NOT in the combat package, just send the defender, attacker, and the rawdamage. By not giving a fake weapon to send, it will know it was not the combat pkg calling it, and will NOT add the anatomy mod to it.


Last edited by MuadDib on Sat Jul 01, 2006 9:43 pm; edited 1 time in total

Author Message
MuadDib
POL Developer


Joined: 13 Feb 2006
Posts: 830
Location: Indiana, USA

PostPosted: Sat Jul 01, 2006 9:42 pm    Post subject: Reply with quote

Displaying Damage Dealt Above Mobs In AOS Clients
ML+ Style in 096!
After a 4 page post on the old forums, I decided to make this quick and simple guide. This is based of 095 Distro, so be sure to change where you put this as needed (if you are not using distro, you should know where it goes then).

Remember, this is based off the newer ML method for displaying damage, and the 096 core's way of handling this.

In the file /pkg/systems/combat/hitScriptInc.inc add these 2 functions:

Code:

// ***************************************************

function DisplayDamage(attacker, damaged, dmg)

  var dmg_packet := CreatePacket(0x0B, 0x07);
  if(dmg <= 255)
    dmg_packet.SetInt8(0x06, dmg);
  else
    dmg_packet.SetInt16(0x05, dmg);
  endif

  dmg_packet.SetInt32(0x01, damaged.serial);

  if(attacker.acct)
    dmg_packet.SendPacket(attacker);
  endif
  if(damaged.acct)
    dmg_packet.SendPacket(damaged);
  endif

endfunction

// ***************************************************


Now, in the function DealDamage, after the line that Sends the ApplyRawDamage, add the following:

Code:

// ***************************************************

set_critical(1);
DisplayDamage(attacker, defender, rawdamage);

// ***************************************************


If you do this, you might want to edit DealDamage()'s function. For Example, this would be the recommended change:

Code:

// ***************************************************
//Original
function DealDamage(defender, attacker, rawdamage, weapon)

// New
function DealDamage(defender, attacker, rawdamage, weapon:=0)
if(weapon)
rawdamage := rawdamage + RandomInt( (GetEffectiveSkill(attacker, 1) ) / 20);
endif

// ***************************************************


Now, the catch is you will want to call the DisplayDamage whereever damage is dealt in other systems too. For instance, like the Spells, or in other scripts that would send damage to the players.

Remember, you send it to both the attacker and the defender. DisplayDamage will see if there is a need to send it (aka, if it's a mob or item then no need).

The easiest way to achieve this being sent always, is to search your scripts to find the damage commands and update them with hitScriptInc.inc and use DealDamage instead. Below is a list of all the core's damage giving commands to replace.

ApplyDamage
ApplyRawDamage

I think those are all anyway. Could be wrong

Then, in the scripts that are NOT in the combat package, just send the defender, attacker, and the rawdamage. By not giving a fake weapon to send, it will know it was not the combat pkg calling it, and will NOT add the anatomy mod to it.

Post new topic   Reply to topic    PenUltima Online Forum Index -> POL Guides All times are GMT - 4 Hours
Page 1 of 1

 




Powered by phpBB © 2001, 2005 phpBB Group :: Theme & Graphics by GHS & Scott E. Royalty