Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // http://herc.ws/board/topic/16037-campfire-to-regenerate-hpsp/
- // https://github.com/dastgirp/HPM-Plugins/blob/master/src/plugins/npc-duplicate.c
- // https://pastebin.com/SWd3DWn1 (rA src mod)
- /* db/item_db2.conf
- {
- Id: 7035
- AegisName: "Matchstick"
- Name: "Matchstick"
- Type: 2
- Buy: 100
- Weight: 10
- BuyingStore: true
- Delay: 1000
- Script: <" callfunc("func_CreateCampFire", rand(2, 5), 60, rand(1,10)); ">
- },
- {
- Id: 1019
- AegisName: "Wooden_Block"
- Name: "Trunk"
- Type: 2
- Buy: 60
- Weight: 10
- BuyingStore: true
- Delay: 1000
- Script: <" callfunc("func_UpdateCampFire", rand(3, 10), 60, rand(5,15)); ">
- },
- {
- Id: 902
- AegisName: "Tree_Root"
- Name: "Tree Root"
- Type: 2
- Buy: 12
- Weight: 10
- BuyingStore: true
- Delay: 1000
- Script: <" callfunc("func_UpdateCampFire", rand(1, 5), 30, rand(1,8)); ">
- },
- */
- function script func_CreateCampFire {
- .@cid = getcharid(CHAR_ID_ACCOUNT);
- .@range = getarg(0, 3); // Heal Range
- .@duration = getarg(1, 60); // Duration
- .@rate = getarg(2, 1); // Heal Rate
- getmapxy(.@map$, .@mapx, .@mapy, UNITTYPE_PC);
- if(getmapxy(.@npc_map$, .@x, .@y, UNITTYPE_NPC, sprintf("Camp Fire#CF_%d",.@cid)) == 0)
- donpcevent "Camp Fire#" + sprintf("CF_%d", .@cid) + "::OnCampFireEnd";
- showscript "Starting a Camp Fire...";
- specialeffect(EF_FIREWALL2, AREA, .@cid);
- progressbar "0xFFFFFF", 1;
- duplicatenpc("cf_main", "Camp Fire", sprintf("CF_%d", .@cid), .@map$, .@mapx, (.@mapy - 1), DIR_SOUTH, 10252, .@range, .@range);
- set(getvariableofnpc(getd(sprintf(".CF_%d_range", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@range);
- set(getvariableofnpc(getd(sprintf(".CF_%d_duration", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@duration);
- set(getvariableofnpc(getd(sprintf(".CF_%d_healrate", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@rate);
- donpcevent "Camp Fire#" + sprintf("CF_%d", .@cid) + "::OnCampFireStart";
- return;
- }
- function script func_UpdateCampFire {
- .@cid = getcharid(CHAR_ID_ACCOUNT);
- .@range = getarg(0, 3); // Heal Range
- .@duration = getarg(1, 60); // Duration
- .@rate = getarg(2, 1); // Heal Rate
- getmapxy(.@map$, .@mapx, .@mapy, UNITTYPE_PC);
- if(getmapxy(.@npc_map$, .@x, .@y, UNITTYPE_NPC, sprintf("Camp Fire#CF_%d",.@cid)) == 0) {
- if (.@npc_map$ != .@map$ || distance(.@mapx, .@mapy, .@x, .@y) > 5) {
- dispbottom "<Camp Fire> You're too far away from the Campfire.";
- }
- else {
- showscript "!!";
- specialeffect(EF_FIREWALL2, AREA, "Camp Fire#" + sprintf("CF_%d", .@cid));
- .@range = min(8, getvariableofnpc(getd(sprintf(".CF_%d_range", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)) + .@range);
- .@duration = min(300, getvariableofnpc(getd(sprintf(".CF_%d_duration", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)) + .@duration);
- .@rate = min(15, getvariableofnpc(getd(sprintf(".CF_%d_healrate", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)) + .@rate);
- set(getvariableofnpc(getd(sprintf(".CF_%d_range", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@range);
- set(getvariableofnpc(getd(sprintf(".CF_%d_duration", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@duration);
- set(getvariableofnpc(getd(sprintf(".CF_%d_healrate", .@cid)), "Camp Fire#" + sprintf("CF_%d", .@cid)), .@rate);
- }
- }
- else {
- dispbottom "<Camp Fire> Start a Campfire...";
- }
- return;
- }
- - script Camp Fire::cf_main FAKE_NPC,{
- end;
- OnCampFireStart:
- getmapxy(.@map$, .@x, .@y, UNITTYPE_NPC);
- .@npcname$ = strnpcinfo(NPC_NAME_HIDDEN);
- do {
- .@range = getd(sprintf(".%s_range", .@npcname$));
- .@healrate = getd(sprintf(".%s_healrate", .@npcname$));
- specialeffect EF_DRAGONSMOKE, AREA;
- showscript "HEAL: "+.@healrate+"% | AREA:"+.@range+" | TIME: "+getd(sprintf(".%s_duration", .@npcname$));
- setd(sprintf(".%s_duration", .@npcname$)), getd(sprintf(".%s_duration", .@npcname$)) - 1;
- areapercentheal(.@map$, (.@x - .@range), (.@y - .@range), (.@x + .@range), (.@y + .@range), .@healrate, .@healrate);
- sleep 1000;
- .@counter++;
- if (.@counter > 0 && .@counter % 10 == 0 && .@healrate > 1) // every 10 seconds reduce heal rate
- setd(sprintf(".%s_healrate", .@npcname$), getd(sprintf(".%s_healrate", .@npcname$)) - 1);
- if (.@counter > 0 && .@counter % 30 == 0 && .@range > 1) // every 30 seconds reduce range
- setd(sprintf(".%s_range", .@npcname$), getd(sprintf(".%s_range", .@npcname$)) - 1);
- } while (getd(sprintf(".%s_duration", .@npcname$)) > 0);
- setd(sprintf(".%s_range", .@npcname$), 0);
- setd(sprintf(".%s_duration", .@npcname$), 0);
- setd(sprintf(".%s_healrate", .@npcname$), 0);
- duplicateremove(strnpcinfo(NPC_NAME_UNIQUE));
- end;
- OnCampFireEnd:
- .@npcname$ = strnpcinfo(NPC_NAME_HIDDEN);
- setd(sprintf(".%s_duration", .@npcname$), 0);
- awake strnpcinfo(NPC_NAME_UNIQUE);
- end;
- OnTouch:
- specialeffect(EF_HEAL, AREA, getcharid(CHAR_ID_ACCOUNT));
- dispbottom("You are feeling warm and cozy.");
- end;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement