Emistry icon

[RO] Campfire - Herc v1.1

Emistry | PRO | 06/23/18 01:47:47 PM UTC | 0 ⭐ | 2423 👁️ | Never ⏰ | []
text |

4.92 KB

|

None

|

0 👍

/

0 👎

// 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;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎