| Blockland Forums > Modification Help |
| Weapon damage outside of minigames |
| << < (2/2) |
| Jorgur:
I did a trace in 3 different cases and came up with 2 possible solutions. Now, I have some questions: - Which solution would be best to use? - Would you recommend any other solutions? - I need to take a look at the functions I want to overwrite. How can I find them? Case 1: I attacked someone else's horse outside of minigame. No damage occurred. My goal is to enable damage in this case (under certain conditions). Case 2: I attacked my own horse outside of minigame. Damage occurred, even though MinigameCanDamage returned -1. This behaviour could be mimicked and applied to case 1. Case 3: I attacked my own horse inside a minigame with weapon damage on. MinigameCanDamage returned 1, so damage occurred. Solution 1 Modify MinigameCanDamage to return 1 when certain conditions are met. A simple solution, but it would seem a bit hacky, since everything happens outside of minigame. Solution 2 Modify ProjectileData::onCollision to call ProjectileData::Damage when certain conditions are met. Less hacky solution. As seen in case 2, Blockland already does this when attacking your own bot outside of minigame. Trace: Passworded internet server 199: My Blockland ID 4382: Someone else's ID --- Code: ---CASE 1 ATTACKING SOMEONE ELSE'S HORSE OUTSIDE OF MINIGAME Entering ProjectileData::onCollision(849, 73697, 73654, 1, 288.526367 0.250000 120.277847, 0.000000 1.000000 0.000000, -0.615194 -79.777100 -11.420200) Entering getBL_IDFromObject(73697) Entering getBrickGroupFromObject(73697) Leaving getBrickGroupFromObject() - return 41197 Leaving getBL_IDFromObject() - return 199 Entering miniGameCanDamage(41190, 73654) Entering getMiniGameFromObject(41190) Leaving getMiniGameFromObject() - return -1 Entering getMiniGameFromObject(73654) Entering SimGroup::getClient(42330) Leaving SimGroup::getClient() - return 0 Leaving getMiniGameFromObject() - return -1 Leaving miniGameCanDamage() - return -1 Leaving ProjectileData::onCollision() - return -1 CASE 2 ATTACKING OWN HORSE OUTSIDE OF MINIGAME Entering ProjectileData::onCollision(849, 73705, 73652, 1, 293.442688 0.250000 120.283272, 0.000000 1.000000 0.000000, -0.619024 -80.273804 -11.491300) Entering getBL_IDFromObject(73705) Entering getBrickGroupFromObject(73705) Leaving getBrickGroupFromObject() - return 41197 Leaving getBL_IDFromObject() - return 199 Entering miniGameCanDamage(41190, 73652) Entering getMiniGameFromObject(41190) Leaving getMiniGameFromObject() - return -1 Entering getMiniGameFromObject(73652) Entering SimGroup::getClient(41197) Leaving SimGroup::getClient() - return 41190 Entering SimGroup::getClient(41197) Leaving SimGroup::getClient() - return 41190 Leaving getMiniGameFromObject() - return -1 Leaving miniGameCanDamage() - return -1 Entering ProjectileData::Damage(849, 73705, 73652, 1, 293.442688 0.250000 120.283272, 0.000000 1.000000 0.000000) Entering ShapeBase::Damage(73652, 73705, 293.442688 0.250000 120.283272, 35, 10) Entering Armor::Damage(855, 73652, 73705, 293.442688 0.250000 120.283272, 35, 10) Entering Armor::onDamage(855, 73652, 35.000000) Entering Player::playPain(73652) Leaving Player::playPain() - return 855 Leaving Armor::onDamage() - return 855 Entering Player::emote(73652, PainMidImage, 1) Leaving Player::emote() - return 73652 Leaving Armor::Damage() - return 73652 Leaving ShapeBase::Damage() - return 73652 Leaving ProjectileData::Damage() - return 73652 Entering ProjectileData::impactImpulse(849, 73705, 73652, -0.619024 -80.273804 -11.491300) Leaving ProjectileData::impactImpulse() - return 218836 Leaving ProjectileData::onCollision() - return 218836 CASE 3 ATTACKING OWN HORSE INSIDE MINIGAME Entering ProjectileData::onCollision(849, 73765, 73744, 1, 293.506836 0.250000 120.421066, 0.000000 1.000000 0.000000, 3.230390 -76.527901 -6.085890) Entering getBL_IDFromObject(73765) Entering getBrickGroupFromObject(73765) Leaving getBrickGroupFromObject() - return 41197 Leaving getBL_IDFromObject() - return 199 Entering miniGameCanDamage(41190, 73744) Entering getMiniGameFromObject(41190) Leaving getMiniGameFromObject() - return 73717 Entering getMiniGameFromObject(73744) Entering SimGroup::getClient(41197) Leaving SimGroup::getClient() - return 41190 Entering SimGroup::getClient(41197) Leaving SimGroup::getClient() - return 41190 Leaving getMiniGameFromObject() - return 73717 Leaving miniGameCanDamage() - return 1 Entering ProjectileData::Damage(849, 73765, 73744, 1, 293.506836 0.250000 120.421066, 0.000000 1.000000 0.000000) Entering ShapeBase::Damage(73744, 73765, 293.506836 0.250000 120.421066, 35, 10) Entering Armor::Damage(855, 73744, 73765, 293.506836 0.250000 120.421066, 35, 10) Entering Armor::onDamage(855, 73744, 35.000000) Entering Player::playPain(73744) Leaving Player::playPain() - return 855 Leaving Armor::onDamage() - return 855 Entering Player::emote(73744, PainMidImage, 1) Leaving Player::emote() - return 73744 Leaving Armor::Damage() - return 73744 Leaving ShapeBase::Damage() - return 73744 Leaving ProjectileData::Damage() - return 73744 Entering ProjectileData::impactImpulse(849, 73765, 73744, 3.230390 -76.527901 -6.085890) Leaving ProjectileData::impactImpulse() - return 237494 Leaving ProjectileData::onCollision() - return 237494 --- End code --- |
| Red_Guy:
--- Quote from: Jorgur on April 26, 2011, 02:00:02 PM ---Solution 2 Modify ProjectileData::onCollision to call ProjectileData::Damage when certain conditions are met. Less hacky solution. As seen in case 2, Blockland already does this when attacking your own bot outside of minigame. --- End quote --- I would not reccomend this solution. When you shoot with the rocket launcher or tank turret, or anything that does AOE damage, then you also need to modify Projectile::onExplode, and addon with its own ::onExplode will cause problems. You will also have problems with the blast throwing players around, even if it doesnt do any damage. Suggested solution: 1) Always use a minigame. 2) RE-write (not override) MinigameCanDamage to use whatever conditions you want. - this means you never call "Parent" in your version of the function. 3) use bots with care |
| Greek2me:
--- Quote from: Jorgur on April 26, 2011, 02:00:02 PM ---Solution 1 Modify MinigameCanDamage to return 1 when certain conditions are met. A simple solution, but it would seem a bit hacky, since everything happens outside of minigame. --- End quote --- Why don't you simply do this in a minigame? If you need an example of a minigame that doesn't need an owner and starts automatically, look here, although that's a pretty bad one. |
| Navigation |
| Message Index |
| Previous page |