Nurkz

Donators
  • Публикации

    161
  • Зарегистрирован

  • Посещение

Репутация

94 Приношу пользу

1 подписчик

О Nurkz

  • Звание
    Продвинутый пользователь
  • День рождения 05/06/1993

Информация

  • Пол Мужчина
  • Город Tallinn

Контакты

  • Skype [email protected]ook.com

Посетители профиля

3,496 просмотров профиля
  1. Stylist,Reset NPC Unknown syntax

    смените кодировку на utf8
  2. Если будет нужно что, пиши телеграм @Nurkz, помогу по мере свободного времени
  3. Break (Дмитрий Корыткин)

    Чет у вас тут страсти
  4. НПЦ скрипт

    status_calc_misc(&nd->bl, &nd->status, nd->level); Извиняюсь =) Еще было бы правильно поправить status_get_status_data и status_get_base_status. Обновил пост выше.
  5. НПЦ скрипт

    В rA и Herc уже можно давным давно давать статы нпсам, но если у нас eAthena, ничего страшного, всегда можно стырить =) Ну во первых изменим в src/map/script.c функции unitskilluseid и unitskillusepos Меняем в функции unitskilluseid: if( bl != NULL ) unit_skilluse_id(bl, target_id, skill_id, skill_lv); На: if (bl != NULL) { if (bl->type == BL_NPC) { if (!((TBL_NPC*)bl)->status.hp) status_calc_npc(((TBL_NPC*)bl), true); else status_calc_npc(((TBL_NPC*)bl), false); } unit_skilluse_id(bl, target_id, skill_id, skill_lv); } И в unitskillusepos: if( bl != NULL ) unit_skilluse_pos(bl, skill_x, skill_y, skill_id, skill_lv); На: if (bl != NULL) { if (bl->type == BL_NPC) { if (!((TBL_NPC*)bl)->status.hp) status_calc_npc(((TBL_NPC*)bl), true); else status_calc_npc(((TBL_NPC*)bl), false); } unit_skilluse_pos(bl, skill_x, skill_y, skill_id, skill_lv); }   Далее добавим функцию добавления статов нпсу =) BUILDIN_FUNC(setnpcstats) { TBL_NPC* nd = NULL; unsigned int value = 0; if (script_hasdata(st,2)) nd = map_id2nd(script_getnum(st,2)); else nd = map_id2nd(st->oid); if (nd == NULL) return 0; if (script_hasdata(st,3)) value = script_getnum(st,3); if (!nd->status.hp) status_calc_npc(nd, true); else status_calc_npc(nd, false); break; nd->stat_point = value > 0 ? value : 999; status_calc_misc(&nd->bl, &nd->status, nd->level); } и ниже описываем что она будет принимать: (Всего два необязательных параметра) BUILDIN_DEF(setnpcstats,"??"),   Далее идем в src/map/status.c и функцию status_calc_bl_ в свиче добавляем новый кейс которым будет выглядеть данным образом: case BL_NPC: status_calc_npc_(BL_CAST(BL_NPC,bl), first); break; Далее ищем status_get_status_data и добавляем: case BL_NPC: return ((mobdb_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : &dummy_status); То же самое ниже в status_get_base_status: case BL_NPC: return ((mobdb_checkid(((TBL_NPC*)bl)->class_) == 0) ? &((TBL_NPC*)bl)->status : NULL); И добавляем функцию status_calc_npc_: int status_calc_npc_(struct npc_data *nd, bool first) { struct status_data *status = &nd->status; if (!nd) return 0; if (first) { status->hp = 1; status->sp = 1; status->max_hp = 1; status->max_sp = 1; status->def_ele = ELE_NEUTRAL; status->ele_lv = 1; status->race = RC_DEMIHUMAN; status->size = nd->size; status->rhw.range = 1 + status->size; status->mode = (MD_CANMOVE|MD_CANATTACK); status->speed = nd->speed; } status->str = nd->stat_point + nd->params.str; status->agi = nd->stat_point + nd->params.agi; status->vit = nd->stat_point + nd->params.vit; status->int_= nd->stat_point + nd->params.int_; status->dex = nd->stat_point + nd->params.dex; status->luk = nd->stat_point + nd->params.luk; status_calc_misc(&nd->bl, status, nd->level); status_cpy(&nd->status, status); return 0; } Далее заходим в src/map/status.h В самом верху песле строчки: struct mercenary_data; Добавляем: struct npc_data; Листаем в самый низ и находим: #define status_calc_mercenary(md, first) status_calc_bl_(&(md)->bl, SCB_ALL, first) Добавляем следующей строчкой: #define status_calc_npc(nd, first) status_calc_bl_(&(nd)->bl, SCB_ALL, first) Ниже видим: int status_calc_mercenary_(struct mercenary_data *md, bool first); Добавляем: int status_calc_npc_(struct npc_data *nd, bool first); Далее идём в src/map/npc.h и видим строчку: unsigned size : 2; Ниже добавляем: struct status_data status; unsigned int level,stat_point; struct s_npc_params { unsigned short str, agi, vit, int_, dex, luk; } params; Вот вроде и всё, рекомпилим и пишем в скрипте: getmapxy .@map$, .@x, .@y, 1; setnpcstats getnpcid(0), 999; unitskillusepos getnpcid(0), WZ_METEOR, 10, .@x, .@y;   ПС! Хотя я бы всё же рекомендовал перейти на rA/Herc и использовать setunitdata. Может кому нужно будет, пусть будет.
  6. НПЦ скрипт

    А почему бы не дать нпцу статов?)
  7. подскажите с ехе для eathena

    Скажите ревизию rA или лучше выложите эмулятор.
  8. заходим в skill_db.txt и ищем: Вот и всё =) А насчет Devo, он вроде и так по дефолту работает так как ты хочешь О_О
  9. Заходим в mob.c и находим строки : } else if( mvp_sd && !md->state.npc_killmonster ) { pc_setparam(mvp_sd, SP_KILLEDRID, md->mob_id); И далее вписываем : Для rA : pc_setreg(mvp_sd, add_str("@mobdead_m"), md->bl.m); pc_setreg(mvp_sd, add_str("@mobdead_x"), md->bl.x); pc_setreg(mvp_sd, add_str("@mobdead_y"), md->bl.y); Для Herc соответственно : pc_setreg(mvp_sd, script->add_str("@mobdead_m"), md->bl.m); pc_setreg(mvp_sd, script->add_str("@mobdead_x"), md->bl.x); pc_setreg(mvp_sd, script->add_str("@mobdead_y"), md->bl.y); Сохраняем, компилим, и вуаля, у нас есть все необходимое. - script custom_drop -1,{ end; OnNPCKillEvent: switch(killedrid) { default: break; case 1002: makeitem 20000,1,mapid2name(@mobdead_m),@mobdead_x,@mobdead_y; break; } end; } Имхо, куда легче, чем лопатить всех мобов и делать их эвентными.
  10. getpartymember getcharid(1), 2; for (set .@i, 0; .@i < [email protected]; set .@i, .@i + 1) { if (attachrid([email protected][.@i])) { set round1, round1 + 1; if (round1 == 5) { warp "prontera",0,0; } } }  
  11. percentheal 100, (Sp > (MaxSp / 2)? 0 : 50); close;  
  12. Крестик в пати после смерти

    Если кто-то из пати находится на другой локации, ему будут "мерещиться призраки", нужна проверка на локацию, да и в итоге банальный refresh или fly wing сбивает тот самый крестик, лучше делать через src имхо.  
  13. prontera,155,167,3 script Валентинка 611,{ if(#q_profession == 1) { dispbottom "Ты уже получал Подарок Валентинки!"; end; } mes "^FF4500[Любовь]^000000"; mes "Привет, ^FF1493С днём Святого Валентина вас!^000000"; mes "В этот чудесный праздник я решила сделать вам подарок"; next; mes "^FF4500[Любовь]^000000"; mes "Если вы хотите подарочек! Принесите мне скромные предметы"; mes "Вы поздравите меня а я вас"; next; if (select("Хорошо, Что бы ты хотела?","У меня других дел хватает") == 1) { mes "^FF4500[Любовь]^000000"; mes "Мне очень хочется тортика, Я сладкоежка"; mes "Добыть Можно тортик со всех монстров на локациях с шансом 10%"; mes "Принеси мне 10 тортиков и я дам тебе подарочек"; next; if (countitem(6099) < 10) { mes "^FF4500[Любовь]^000000"; mes "У тебя нету Тортиков, Приходи с тортиками"; close; } delitem 6099,10; getitem 13822,1; #q_profession = 1; } close; }  
  14. Проверку нужно вписать в clif_parse_UseSkillToId uint16 idx = skill_get_index(HLIF_CHANGE); struct homun_data *hd = sd->hd; if (skill_id == AL_TELEPORT) { hd->blockskill[idx] = 0; } Заранее извиняюсь если где напутал, сижу с телефона, к ПК пока нет возможности подойти. Под rAthena.