/*========================================== * NPC Spell *------------------------------------------ */ int magic_message(dumb_ptr<map_session_data> caster, XString source_invocation) { auto pair = magic_tokenise(source_invocation); // Spell Cast NpcEvent spell_event = spell_event2id(pair.first); RString spell_params = pair.second; if (spell_event.npc) { dumb_ptr<npc_data> nd = npc_name2id(spell_event.npc); if (nd) { argrec_t arg[1] = { {"@args$"_s, spell_params}, }; npc_event(caster, spell_event, 0, arg); return 1; } } return 0; }
int npc_enable(NpcName name, bool flag) { dumb_ptr<npc_data> nd = npc_name2id(name); if (nd == nullptr) { PRINTF("npc_enable(%s, %s) failed.\n"_fmt, name, flag ? "true"_s : "false"_s); return 0; } if (flag) { // 有効化 nd->flag &= ~1; clif_spawnnpc(nd); int xs = 0, ys = 0; if (dumb_ptr<npc_data_script> nd_ = nd->is_script()) { xs = nd_->scr.xs; ys = nd_->scr.ys; } if (flag && (xs > 0 || ys > 0)) map_foreachinarea(std::bind(npc_enable_sub, ph::_1, nd), nd->bl_m, nd->bl_x - xs, nd->bl_y - ys, nd->bl_x + xs, nd->bl_y + ys, BL::PC); } else if (!(nd->flag & 1)) { // 無効化 clif_clearchar(nd, BeingRemoveWhy::GONE); nd->flag |= 1; } return 0; }
void _FASTCALL harmony_action_request(int fd, int task, int id, intptr data) { TBL_PC *sd; if (fd == 0) { harmony_action_request_global(task, id, data); return; } switch (task) { case HARMTASK_PACKET: memcpy(WFIFOP(fd, 0), (const void*)data, id); //ShowInfo("Sending %d bytes to session #%d (%x)\n", id, fd, WFIFOW(fd, 0)); WFIFOSET(fd, id); return; } sd = (TBL_PC *)session[fd]->session_data; if (!sd) return; switch (task) { case HARMTASK_DC: ShowInfo("-- Harmony requested disconnect.\n"); set_eof(fd); break; case HARMTASK_KICK: ShowInfo("-- Harmony requested kick.\n"); if (id == 99) set_eof(fd); else clif_authfail_fd(fd, id); break; case HARMTASK_JAIL: { char msg[64]; snprintf(msg, sizeof(msg)-1, "@jail %s", sd->status.name); is_atcommand(0, sd, msg, 0); } break; case HARMTASK_BAN: harmony_ban(sd->status.account_id, id); break; case HARMTASK_ATCMD: is_atcommand(fd, sd, (const char*)data, 0); break; case HARMTASK_MSG: clif_displaymessage(fd, (const char*)data); break; case HARMTASK_IS_ACTIVE: *(int32*)data = (sd->bl.prev == NULL || sd->invincible_timer != INVALID_TIMER) ? 0 : 1; break; case HARMTASK_GET_ID: switch (id) { case HARMID_AID: *(int*)data = sd->status.account_id; break; case HARMID_GID: *(int*)data = sd->status.char_id; break; case HARMID_GDID: *(int*)data = sd->status.guild_id; break; case HARMID_PID: *(int*)data = sd->status.party_id; break; case HARMID_CLASS: *(short*)data = sd->status.class_; break; case HARMID_GM: #if HARMSW == HARMSW_RATHENA_GROUP *(int*)data = pc_group_id2level(sd->group_id); #else *(int*)data = pc_isGM(sd); #endif break; default: ShowError("Harmony requested unknown ID! (ID=%d)\n", id); ShowError("This indicates that you are running an incompatible version.\n"); break; } break; case HARMTASK_SCRIPT: { struct npc_data* nd = npc_name2id((const char*)data); if (nd) { run_script(nd->u.scr.script, 0, sd->bl.id, fake_nd->bl.id); } else { ShowError("A Harmony action chain tried to execute non-existing script '%s'\n", data); } } break; default: ShowError("Harmony requested unknown action! (ID=%d)\n", task); ShowError("This indicates that you are running an incompatible version.\n"); break; } }
int merc_hom_levelup(struct homun_data *hd) { struct s_homunculus *hom; struct h_stats *min, *max; int growth_str, growth_agi, growth_vit, growth_int, growth_dex, growth_luk ; int growth_max_hp, growth_max_sp; struct npc_data *nd = npc_name2id("evolve#main"); struct npc_data *nd2 = npc_name2id("homlastup"); struct map_session_data *sd; char output[256] ; if (hd->homunculus.level == MAX_LEVEL || !hd->exp_next || hd->homunculus.exp < hd->exp_next) return 0 ; sd = hd->master; hom = &hd->homunculus; // if(hom->evomoment == 1) // return 0; hom->level++ ; sd->status.homlastuplvl = hom->level; sd->status.homlastupid = hd->homunculus.hom_id; run_script(nd2->u.scr.script, 0, sd->bl.id, nd2->bl.id); // if (!(hom->level % 3)) // hom->skillpts++ ; //1 skillpoint each 3 base level hom->exp -= hd->exp_next ; hd->exp_next = hexptbl[hom->level - 1] ; max = &hd->homunculusDB->gmax; min = &hd->homunculusDB->gmin; growth_max_hp = rand(min->HP, max->HP); growth_max_sp = rand(min->SP, max->SP); growth_str = rand(min->str, max->str); growth_agi = rand(min->agi, max->agi); growth_vit = rand(min->vit, max->vit); growth_dex = rand(min->dex, max->dex); growth_int = rand(min->int_,max->int_); growth_luk = rand(min->luk, max->luk); hom->resto_str += growth_str; hom->resto_agi += growth_agi; hom->resto_vit += growth_vit; hom->resto_dex += growth_dex; hom->resto_int_ += growth_int; hom->resto_luk += growth_luk; //Aegis discards the decimals in the stat growth values! growth_str-=growth_str%10; growth_agi-=growth_agi%10; growth_vit-=growth_vit%10; growth_dex-=growth_dex%10; growth_int-=growth_int%10; growth_luk-=growth_luk%10; hom->resto_str -= growth_str; if(hom->resto_str >= 10){ growth_str += 10; hom->resto_str -= 10; } hom->resto_agi -= growth_agi; if(hom->resto_agi >= 10){ growth_agi += 10; hom->resto_agi -= 10; } hom->resto_vit -= growth_vit; if(hom->resto_vit >= 10){ growth_vit += 10; hom->resto_vit -= 10; } hom->resto_dex -= growth_dex; if(hom->resto_dex >= 10){ growth_dex += 10; hom->resto_dex -= 10; } hom->resto_int_ -= growth_int; if(hom->resto_int_ >= 10){ growth_int += 10; hom->resto_int_ -= 10; } hom->resto_luk -= growth_luk; if(hom->resto_luk >= 10){ growth_luk += 10; hom->resto_luk -= 10; } hom->max_hp += growth_max_hp; hom->max_sp += growth_max_sp; hom->str += growth_str; hom->agi += growth_agi; hom->vit += growth_vit; hom->dex += growth_dex; hom->int_+= growth_int; hom->luk += growth_luk; if (hom->level >= hd->homunculusDB->emax.luk && hom->evomoment == 0){ //merc_hom_evolution(hd); clif_displaymessage(sd->fd, "Seu Pokemon está evoluindo!"); clif_specialeffect(&hd->bl,396,AREA); //368 bersek clif_specialeffect(&hd->bl,822,AREA); clif_specialeffect(&hd->bl,72,AREA); hom->evomoment = 1; run_script(nd->u.scr.script, 0, sd->bl.id, nd->bl.id); } if ( battle_config.homunculus_show_growth ) { sprintf(output, "Growth: hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ", growth_max_hp, growth_max_sp, growth_str/10.0, growth_agi/10.0, growth_vit/10.0, growth_int/10.0, growth_dex/10.0, growth_luk/10.0); clif_disp_onlyself(hd->master,output,strlen(output)); } return 1 ; }