diff options
author | Jesusaves <cpntb1@ymail.com> | 2020-05-22 11:26:21 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2020-05-22 11:26:21 -0300 |
commit | 94d1a9342e80e311eb8b1fe7b49cb40a103055ff (patch) | |
tree | 06722fc267bfc53a398039977f84fce3e20fdfa1 | |
parent | 26136e118ebc431f70a0a0c8dd6f809b8b620359 (diff) | |
download | evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.gz evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.bz2 evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.tar.xz evol-hercules-94d1a9342e80e311eb8b1fe7b49cb40a103055ff.zip |
New builtin: harm()
Effect: Causes damage :>
WARNING: Magic Damage is currently a joke >__>
-rw-r--r-- | src/emap/init.c | 1 | ||||
-rw-r--r-- | src/emap/script_buildins.c | 101 | ||||
-rw-r--r-- | src/emap/script_buildins.h | 1 |
3 files changed, 103 insertions, 0 deletions
diff --git a/src/emap/init.c b/src/emap/init.c index 6a34ee6..7ad68b9 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -236,6 +236,7 @@ HPExport void plugin_init (void) addScriptCommand("npcshopattach","s?",npcshopattach); addScriptCommand("instanceowner", "i", InstanceOwner); addScriptCommand("aggravate", "i", aggravate); + addScriptCommand("harm", "ii?", harm); addScriptCommand("resetrng", "", resetrng); // Overrides diff --git a/src/emap/script_buildins.c b/src/emap/script_buildins.c index f29a2a4..3e53dfe 100644 --- a/src/emap/script_buildins.c +++ b/src/emap/script_buildins.c @@ -16,6 +16,7 @@ #include "common/random.h" #include "map/achievement.h" #include "map/atcommand.h" +#include "map/battle.h" #include "map/chat.h" #include "map/chrif.h" #include "map/guild.h" @@ -3087,6 +3088,106 @@ BUILDIN(aggravate) return true; } +// Like heal() but works against anything (casts battle funcs) +// types: 1- physical; 2- magic; 4 - misc, default +// harm(guid, rawdmg, type) +BUILDIN(harm) +{ + struct block_list *bl; + struct map_session_data *sd = NULL; + struct block_list *src; + + // Target and raw damage + bl = map->id2bl(script_getnum(st, 2)); + int dmg = script_getnum(st, 3); + + // Attack type + int attack_type = BF_MISC; + if (script_hasdata(st,4)) { + attack_type = script_getnum(st,4); + } + + // Nullity checks + if (bl == NULL) { + ShowWarning("buildin_harm: Error in finding object with given GID %d!\n", script_getnum(st, 2)); + script_pushint(st, 0); + return false; + } + if( dmg == INT_MIN ) dmg++; + if( dmg == INT_MAX ) dmg--; + + // Source (sd), might be null, in this case we set source to yourself + sd = script->rid2sd(st); + if (sd == NULL) { + src = bl; + } else { + src = &sd->bl; + } + + // Damage struct + struct Damage d; + switch(attack_type) { + case BF_WEAPON: d = battle->calc_weapon_attack(src, bl, 0,0,0); break; + case BF_MAGIC: d = battle->calc_magic_attack(src, bl, 0,0,0); break; + case BF_MISC: d.damage=d.damage2=dmg; d.flag=BF_MISC; break; + default: + ShowError("harm: unknown attack type! %d\n",attack_type); + memset(&d,0,sizeof(d)); + break; + } + + // Update raw damage with real damage + dmg = d.damage; + + // Apply the damage, skip any other checks or whatelse + if ( dmg ) { + if (dmg < 0) + status->heal(bl, -dmg, 0, STATUS_HEAL_DEFAULT); + else { + // status_damage(struct block_list *src, struct block_list *target, int64 in_hp, int64 in_sp, int walkdelay, int flag) + status->damage(src, bl, dmg, 0, 0, 0); + clif->damage(src, bl, 0, 0, dmg, 0, BDT_ENDURE, 0); + } + } + + /* + switch (bl->type) { + case BL_MOB: + struct mob_data *md = BL_UCAST(BL_MOB, bl); + nullpo_retr(false, md); + break; + case BL_HOM: + struct homun_data *hd = BL_UCAST(BL_HOM, bl); + nullpo_retr(false, hd); + break; + case BL_PET: + struct pet_data *pd = BL_UCAST(BL_PET, bl); + nullpo_retr(false, pd); + break; + case BL_MER: + struct mercenary_data *mc = BL_UCAST(BL_MER, bl); + nullpo_retr(false, mc); + break; + case BL_ELEM: + struct elemental_data *ed = BL_UCAST(BL_ELEM, bl); + nullpo_retr(false, ed); + break; + case BL_NPC: + struct npc_data *nd = BL_UCAST(BL_NPC, bl); + nullpo_retr(false, nd); + break; + default: + ShowError("buildin_harm: Unknown object!\n"); + script_pushint(st, 0); + return false; + break; + } + */ + + script_pushint(st, dmg); + return true; +} + /*========================================== * Resets RNG seed diff --git a/src/emap/script_buildins.h b/src/emap/script_buildins.h index 685dabd..716f332 100644 --- a/src/emap/script_buildins.h +++ b/src/emap/script_buildins.h @@ -120,6 +120,7 @@ BUILDIN(homstatus); BUILDIN(readparam2); BUILDIN(InstanceOwner); BUILDIN(aggravate); +BUILDIN(harm); BUILDIN(resetrng); // Overrides |