Monster_death_timer - Jeybla/rathena GitHub Wiki


title: Monster death timer permalink: /Monster_death_timer/

Introduction

Information

For some quests, you may want to summon a monster that only exists for a certain amount of time. In order to do this, it may be easier to add a new command which will allow you to setup an auto-mated death timer on the monster itself.

This way, there's no dependencies on script timers, and the death will be personal the monster itself.

Pre-requisites

In order for this command to work, you'll need to install the retrieve monster GID edit first.

Open /src/map/script.c

Place this code somewhere:

/*==========================================
 * Adds a death timer to a monster [Epoque]
 *------------------------------------------*/
BUILDIN_FUNC(deathtimer)
{
    int block_id;
    unsigned int tick;
    struct mob_data* md;

    block_id = script_getnum(st, 2);
    tick = script_getnum(st, 3);
    md = map_id2md(block_id);

    if(md == NULL)
        return 0;

    if(md->kill_timer > 0)
    {
        delete_timer(md->kill_timer, mob_death_timer);
        md->kill_timer = INVALID_TIMER;
    }

    md->kill_timer = add_timer(gettick()+tick, mob_death_timer, md->bl.id, 0);

    return 1;
}

Find:

   BUILDIN_DEF(changequest, "ii"),

Below add:

   BUILDIN_DEF(deathtimer, "ii"),

Open /src/map/mob.h

Find:

   short min_chase;

Below add:

   int kill_timer;

Find:

int mob_countslave(struct block_list *bl);

Below add:

int mob_death_timer(int tid, unsigned int tick, int id, intptr data);

Open /src/map/mob.c

Find:

void mob_revive(struct mob_data *md, unsigned int hp)
{
    unsigned int tick = gettick();

Above add:

int mob_death_timer(int tid, unsigned int tick, int id, intptr data)
{
    struct mob_data* md;

    if( !(md = map_id2md(id)) || md->kill_timer == INVALID_TIMER )
        return 0;

    if( status_isdead(&md->bl) )
        return 0;

    status_kill(&md->bl);

    return 1;
}

Usage

To use the command, you can use it this way:

set .@MobID, monster("map", x, y, name, class, 1);
deathtimer .@MobID, 30000; // Automatically kills the monster after 30 seconds.

The alternative (through basic scripts) is this:

-  script  MobControl  -1,{
OnInit:
    monster "map", x, y, name, class, 1, "MobControl::OnMobKilled";
    initnpctimer;
    end;

OnTimer30000:
    killmonster "map", "MobControl::OnMobKilled";
    end;

OnMobKilled:
    end;
}

Category:Source Snippets