Jump to content

Alayne

Members
  • Content Count

    345
  • Joined

  • Last visited

  • Days Won

    22

Posts posted by Alayne


  1. Give this a try. 

    //===== Hercules Script ======================================
    //= Euphy's WOE Controller
    //===== By: ==================================================
    //= Euphy
    //===== Current Version: =====================================
    //= 1.5
    //===== Description: =========================================
    //= A controller for War of Emperium designed for
    //= simplicity and ease of use.
    //= Many concepts taken from ToastOfDoom's script,
    //= and "rewards" function originally by Goddameit.
    //===== Additional Comments: =================================
    //= Be sure to disable the default agit controllers!
    //== npc\woe-fe\agit_controller.txt
    //== npc\woe-se\agit_start_se.txt
    //============================================================
    
    // Information NPC
    //============================================================
    warcraft,207,196,5	script	WOE Information	2_BULLETIN_BOARD,{
    	doevent "WOE_CONTROL::OnMenu";
    	end;
    OnAgitStart:
    	while(agitcheck()) {
    		misceffect EF_BEGINSPELL6;
    		sleep 425;
    	}
    	end;
    }
    
    // Script Core
    //============================================================
    -	script	WOE_CONTROL	FAKE_NPC,{
    function Disp_Owner; function Add_Zero;
    
    OnInit:
    
    // -----------------------------------------------------------
    //  Configuration settings.
    // -----------------------------------------------------------
    
    	set .CastleWarp,0;		// 1: Always enable all castle warps. | 0: Warp only to active castles.
    	set .AutoKick,1;		// Automatically kick players from inactive castles during WOE? (1:yes / 0:no)
    	set .NoOwner,0; 		// Automatically kick players from unconquered castles outside of WOE? (1:yes / 0:no)
    	set .ExitWarp,0;		// Warp all players from castles when WOE ends? (1:yes / 0:no)
    	set .GMAccess,99;		// GM level required to access Session Manager.
    
    // -----------------------------------------------------------
    //  Reward options.
    // -----------------------------------------------------------
    //  [1] Enable rewards.
    //  [2] Mail all rewards.
    //      - If not set, players receive items in their inventory.
    //      - Only ONE item can be sent via mail, plus Zeny.
    //      - Note that offline players do NOT receive rewards.
    //  [4] Only reward Guild Masters.
    //      - If not set, all guild members are rewarded.
    //      - If mailing is enabled (option 2), offline Guild Masters WILL receive rewards.
    //  [8] Duplicate IP check.
    //      - Members in a guild with the same IP address are not rewarded.
    //      - If Guild Masters is enabled (option 4), this feature is not used.
    // -----------------------------------------------------------
    
    	// Combine values as needed (e.g. 1|8 = 1+8 = 9).
    	set .Options, 1|8;
    
    	// Rewards per castle.
    	// -- when given directly: <itemID>,<amount>{,<itemID>,<amount>,...}
    	// -- via mail (option 2): <itemID>,<amount>,<Zeny>
    	setarray .Reward[0],14001,1;
    
    // -----------------------------------------------------------
    //  Constants (leave this section alone).
    // -----------------------------------------------------------
    
    	setarray .Castles$[0],
    		"prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05",
    		"payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05",
    		"gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05",
    		"aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05",
    		"arug_cas01","arug_cas02","arug_cas03","arug_cas04","arug_cas05",
    		"schg_cas01","schg_cas02","schg_cas03","schg_cas04","schg_cas05";
    	setarray .EndLabel$[0],"ar01","ar02","ar03","ar04","ar05","sc01","sc02","sc03","sc04","sc05";
    	setarray .Days$[0],"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday";
    	setarray .Regions$[0],"Prontera","Payon","Geffen","Aldebaran","Arunafeltz","Schwaltzvalt";
    	setarray .Map$[0],"prt_gld","pay_gld","gef_fild13","alde_gld","aru_gld","sch_gld";
    	setarray .MapX[0],134,240,153,111,208,121,295,317,140,204,214,308,143,193,305,48, 95,142,239,264,158,83, 68,299,292,293,288, 97,137, 71;
    	setarray .MapY[0], 65,128,137,240,240,233,116,293,160,266, 75,240,240,278, 87,83,249, 85,242, 90,272,47,155,345,107,100,252,196, 90,315;
    
    // -----------------------------------------------------------
    
    	set .Size, getarraysize($WOE_CONTROL);
    	if (.AutoKick || .NoOwner)
    		for(set .@i,0; .@i<30; set .@i,.@i+1) {
    			setmapflag .Castles$[.@i], mf_loadevent;
    			setd "."+.Castles$[.@i], .@i;
    		}
    	if (!agitcheck() && !agitcheck2()) sleep 4000;
    	set .Init,1;
    	
    	while(1) {
    		delwaitingroom;
    		waitingroom "Clock "+ gettimestr( "%I:%M:%S %p",21 ),0;
    		sleep 1000;
        }
    	end;
    	
    OnMinute00:
    	freeloop(1);
    	if (agitcheck() || agitcheck2()) {
    		for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    			if (gettime(GETTIME_WEEKDAY) == $WOE_CONTROL[.@i] && gettime(GETTIME_HOUR) == $WOE_CONTROL[.@i+2]) {
    			OnWOEEnd:
    				announce "The War Of Emperium is over!",bc_all|bc_woe;
    				agitend; agitend2;
    				sleep 1000;
    				for(set .@j,0; .@j<30; set .@j,.@j+1) {
    					if (.Active[0]&(1<<.@j)) Disp_Owner(.Castles$[.@j],1);
    					if (.ExitWarp) maprespawnguildid .Castles$[.@j],0,3;
    				}
    				if (.Options&1 && .Active[0] && .ForceEnd != 2) callsub OnReward, .Active[0];
    				deletearray .Active[0],2;
    				if (.ForceEnd) { set .ForceEnd,0; end; }
    				break;
    			}
    	}
    	if ((!agitcheck() && !agitcheck2()) || .Init) {
    		if (!agitcheck() && !agitcheck2()) set .Init,0;
    		for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    			if (gettime(GETTIME_WEEKDAY) == $WOE_CONTROL[.@i] && gettime(GETTIME_HOUR) >= $WOE_CONTROL[.@i+1] && gettime(GETTIME_HOUR) < $WOE_CONTROL[.@i+2]) {
    				deletearray .Active[0],2;
    				set .Active[0], $WOE_CONTROL[.@i+3];
    				if (.Init) { agitend; agitend2; }
    				else announce "The War Of Emperium has begun!",bc_all|bc_woe;
    				sleep 1000;
    				agitstart; agitstart2;
    				for(set .@j,0; .@j<30; set .@j,.@j+1) {
    					if (.Active[0]&(1<<.@j)) {
    						if (!.Init) Disp_Owner(.Castles$[.@j],0);
    						set .Active[1], .Active[1] | (1<<((.@j/5)+1));
    					} else {
    						if (.@j<20) {
    							donpcevent "Agit#"+.Castles$[.@j]+"::OnAgitEnd";
    							killmonster .Castles$[.@j], "Agit#"+.Castles$[.@j]+"::OnAgitBreak";
    						} else {
    							donpcevent "Manager#"+.Castles$[.@j]+"::OnAgitEnd2";
    							killmonster .Castles$[.@j], "Steward#"+.EndLabel$[.@j-20]+"::OnStartArena";
    						}
    					}
    				}
    				break;
    			}
    	}
    	set .Init,0;
    	end;
    
    function Disp_Owner {
    	set .@o, getcastledata(getarg(0),1);
    	if (.@o) announce "The ["+getcastlename(getarg(0))+"] castle "+((getarg(1))?"has been conquered":"is currently held")+" by the ["+getguildname(.@o)+"] guild.",bc_all|bc_woe;
    	else announce "The ["+getcastlename(getarg(0))+"] castle is currently unoccupied.",bc_all|bc_woe;
    	return;
    }
    function Add_Zero {
    	return ((getarg(0)<10)?"0":"")+getarg(0)+(getarg(1,0)?".":":")+"00";
    }
    
    OnReward:
    	set .@sql$, ((.Options&4)?"position = 0":"online = 1");
    	if (.Options&2) set .@str$,gettimestr("%B %d, %Y",21);
    	freeloop(1);
    	for(set .@i,0; .@i<30; set .@i,.@i+1)
    		if (getarg(0)&(1<<.@i)) {
    			set .@GID, getcastledata(.Castles$[.@i],1);
    			if (!.@GID) continue;
    			set .@size, query_sql("SELECT account_id,char_id FROM `guild_member` WHERE guild_id = '"+.@GID+"' AND "+.@sql$,.@aid,.@cid);
    			for(set .@j,0; .@j<.@size; set .@j,.@j+1) {
    				if (.Options&8 && !(.Options&4)) {
    					set .@ip$, replacestr(getcharip(.@aid[.@j]),".","a");
    					if (getd(".@ip_"+.@i+"_"+.@ip$)) continue;
    					setd ".@ip_"+.@i+"_"+.@ip$,1;
    				}
    				if (.Options&2) {
    					query_sql("INSERT INTO `mail` (send_name,dest_id,title,message,nameid,amount,identify,zeny,time) VALUES ("+
    					          "'no-reply',"+.@cid[.@j]+",'** Siege Reward: "+getcastlename(.Castles$[.@i])+" **',"+
    					          "'Brave one,% % Congratulations!% Your guild has successfully occupied% territory in the War of Emperium on% "+.@str$+".% % % % % [ Your reward is attached. ]',"+
    					          .Reward[0]+","+.Reward[1]+",0,"+.Reward[2]+",UNIX_TIMESTAMP(NOW()))");
    					if (!getd(".@str_"+.@cid[.@j]) && isloggedin(.@aid[.@j],.@cid[.@j])) {
    						setd ".@str_"+.@cid[.@j],1;
    						message rid2name(.@aid[.@j]),"You've got mail! Please re-login to update your mailing list.";
    					}
    				} else if (isloggedin(.@aid[.@j])) {
    					for(set .@k,0; .@k<getarraysize(.Reward); set .@k,.@k+2)
    						getitem .Reward[.@k], .Reward[.@k+1], .@aid[.@j];
    					message rid2name(.@aid[.@j]),"You have been rewarded for conquering "+getcastlename(.Castles$[.@i])+".";
    				}
    			}
    		}
    	if (.Options&2) query_sql("UPDATE `mail` SET message = REPLACE(message,'%',CHAR(13)) WHERE send_name = 'no-reply'");
    	return;
    
    OnPCLoadMapEvent:
    	if (!compare(strcharinfo(PC_MAP),"g_cas")) end;
    	if (((.AutoKick && .Active[0]) || (.NoOwner && !getcastledata(strcharinfo(PC_MAP),1))) && !(.Active[0]&(1<<getd("."+strcharinfo(PC_MAP))))) {
    		if (getcharid(CHAR_ID_GUILD) && getcastledata(strcharinfo(PC_MAP),1) == getcharid(CHAR_ID_GUILD)) end;
    		sleep2 1000;
    		message strcharinfo(PC_NAME), getcastlename(strcharinfo(PC_MAP))+" is currently inactive.";
    		sleep2 5000;
    		if (compare(strcharinfo(PC_MAP),"g_cas")) warp "SavePoint",0,0;
    	}
    	end;
    
    OnMenu:
    while(1) {
    	mes "[WOE Information]";
    	if (agitcheck() || agitcheck2()) {
    		if (.Active[0]) {
    			for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    				if (gettime(GETTIME_WEEKDAY) == $WOE_CONTROL[.@i] && gettime(GETTIME_HOUR) >= $WOE_CONTROL[.@i+1] && gettime(GETTIME_HOUR) < $WOE_CONTROL[.@i+2]) {
    					set .@i, $WOE_CONTROL[.@i+2];
    					break;
    				}
    			mes "The War of Emperium is ^0055FFactive^000000 until ^FF0000"+Add_Zero(.@i)+"^000000 in the following regions:";
    			mes " ";
    			for(set .@i,0; .@i<6; set .@i,.@i+1)
    				if (.Active[1]&(1<<(.@i+1))) mes " > ^777777"+.Regions$[.@i]+"^000000";
    		} else
    			mes "The War of Emperium is ^0055FFactive^000000.";
    	} else {
    		for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    			if ((gettime(GETTIME_WEEKDAY) == $WOE_CONTROL[.@i] && gettime(GETTIME_HOUR) <= $WOE_CONTROL[.@i+1]) || gettime(GETTIME_WEEKDAY) < $WOE_CONTROL[.@i]) {
    				setarray .@time[0],$WOE_CONTROL[.@i],$WOE_CONTROL[.@i+1];
    				break;
    			}
    		if (!getarraysize(.@time))
    			setarray .@time[0],$WOE_CONTROL[0],$WOE_CONTROL[1];
    		mes "The War of Emperium is ^777777inactive^000000.";
    		if (.Size) {
    			mes " ";
    			mes "The next session will begin";
    			mes "on ^0055FF"+.Days$[.@time[0]]+"^000000 at "+Add_Zero(.@time[1])+"^000000.";
    		}
    	}
    	next;
    	switch(select(((.CastleWarp || .Active[1])?" ~ Warp to castles...":""), "~ Check schedule...", " ~ View castle owners...", ((getgmlevel()<.GMAccess || !getgmlevel())?"":" ~ Manage sessions..."), " ~ ^777777Cancel^000000")) {
    	case 1:
    		if (.CastleWarp) set .@clr$,"^0055FF";
    		set .@menu$,"";
    		for(set .@i,0; .@i<6; set .@i,.@i+1) {
    			if (.CastleWarp || .Active[1]&(1<<(.@i+1)))
    				set .@menu$, .@menu$+" ~ "+((.Active[1]&(1<<(.@i+1)))?.@clr$:"^777777")+.Regions$[.@i]+" Castles^000000";
    			set .@menu$, .@menu$+":";
    		}
    		set .@i, select(.@menu$)-1;
    		set .@menu$,"";
    		for(set .@j,.@i*5; .@j<(.@i*5)+5; set .@j,.@j+1) {
    			if (.CastleWarp || .Active[0]&(1<<.@j))
    				set .@menu$, .@menu$+" ~ "+((.Active[0]&(1<<.@j))?.@clr$:"^777777")+getcastlename(.Castles$[.@j])+"^000000";
    			set .@menu$, .@menu$+":";
    		}
    		set .@j, select(.@menu$)-1;
    		warp .Map$[.@i],.MapX[(.@i*5)+.@j],.MapY[(.@i*5)+.@j];
    		close;
    	case 2:
    		mes "[Schedule]";
    		if (.Size) {
    			freeloop(1);
    			for(set .@i,0; .@i<.Size; set .@i,.@i+4) {
    				mes "> ^FF0000"+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1])+"-"+Add_Zero($WOE_CONTROL[.@i+2])+")^000000";
    				for(set .@j,0; .@j<30; set .@j,.@j+1)
    					if ($WOE_CONTROL[.@i+3]&(1<<.@j)) mes "  ~ "+getcastlename(.Castles$[.@j])+" ^777777("+.Castles$[.@j]+")^000000";
    				if (.@i+4 < .Size) mes " ";
    			}
    			freeloop(0);
    		} else
    			mes "No times are configured.";
    		next;
    		break;
    	case 3:
    		mes "[Castle Ownership]";
    		for(set .@i,0; .@i<6; set .@i,.@i+1) {
    			set .@k, .@i*5;
    			mes "> ^FF0000"+.Regions$[.@i]+"^000000";
    			for(set .@j,.@k; .@j<(.@k+5); set .@j,.@j+1) {
    				set .@t, getcastledata(.Castles$[.@j],1);
    				mes "  ~ "+getcastlename(.Castles$[.@j])+": "+((.@t)?"^0055FF"+getguildname(.@t):"^777777unoccupied")+"^000000";
    			}
    			if (.@i < 5) mes " ";
    		}
    		next;
    		break;
    	case 4:
    	while(1) {
    		mes "[Session Manager]";
    		mes "There are ^0055FF"+(.Size/4)+" session(s)^000000 configured.";
    		mes "What would you like to do?";
    		next;
    		switch(select(" ~ Add a session...", " ~ Delete a session...", " ~ Reload settings...", ((agitcheck() || agitcheck2())?" ~ End WOE session...": ""), " ~ ^777777Go back^000000")) {
    		case 1:
    			mes "[New Session]";
    			if (.Size > 127) {
    				mes "You have already reached the maximum of 32 sessions.";
    				next;
    				break;
    			}
    			mes "Select a day.";
    			next;
    			set .@day, select(" ~ "+implode(.Days$,": ~ "))-1;
    			mes "[New Session]";
    			mes "Select a start time for ^0055FF"+.Days$[.@day]+"^000000.";
    			next;
    			set .@menu$,"";
    			for(set .@i,0; .@i<23; set .@i,.@i+1)
    				set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":";
    			set .@start, select(.@menu$)-1;
    			mes "[New Session]";
    			mes "Select an end time for ^0055FF"+.Days$[.@day]+"^000000.";
    			next;
    			set .@menu$,"";
    			for(set .@i,.@start+1; .@i<24; set.@i,.@i+1)
    				set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":";
    			set .@end, select(.@menu$)+.@start;
    			for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    				if (.@day == $WOE_CONTROL[.@i] &&
    				   ((.@start >= $WOE_CONTROL[.@i+1] && .@start < $WOE_CONTROL[.@i+2]) ||
    				    (.@end > $WOE_CONTROL[.@i+1] && .@end <= $WOE_CONTROL[.@i+2]) ||
    				    (.@start <= $WOE_CONTROL[.@i+1] && .@end >= $WOE_CONTROL[.@i+2]))) {
    					mes "[New Session]";
    					mes "The chosen times overlap with an existing session.";
    					next;
    					set .@d,1;
    					break;
    				}
    			if (.@d) { set .@d,0; break; }
    			set .@castle,0;
    			while(1) {
    				mes "[New Session]";
    				mes "^0055FF"+.Days$[.@day]+" ("+Add_Zero(.@start)+"-"+Add_Zero(.@end)+")^000000";
    				mes " > Castles:";
    				if (!.@castle)
    					mes "   ~ ^777777(none selected)^000000";
    				else for(set .@i,0; .@i<30; set .@i,.@i+1)
    					if (.@castle&(1<<.@i)) mes "   ~ "+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")";
    				next;
    				set .@menu$,((.@castle)?" ~ ^FF0000Finished...^000000":"")+":";
    				for(set .@i,0; .@i<30; set .@i,.@i+1)
    					set .@menu$, .@menu$+" ~ "+((.@castle&(1<<.@i))?"^0055FF":"")+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")^000000:";
    				set .@i, select(.@menu$)-1;
    				if (.@i)
    					set .@castle, .@castle^(1<<(.@i-1));
    				else {
    					mes "[New Session]";
    					mes "Are you sure?";
    					next;
    					switch(select(" ~ ^0055FFAdd session...^000000", " ~ Continue selecting castles...", " ~ ^777777Cancel^000000")) {
    					case 1:
    						for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    							if ((.@day == $WOE_CONTROL[.@i] && .@end <= $WOE_CONTROL[.@i+1]) || .@day < $WOE_CONTROL[.@i]) {
    								set .@d,1;
    								break;
    							}
    						if (!.@d) { set .@d,1; set .@i,.Size; }
    						copyarray $WOE_CONTROL[.@i+4], $WOE_CONTROL[.@i], .Size-.@i;
    						setarray $WOE_CONTROL[.@i], .@day, .@start, .@end, .@castle;
    						set .Size, getarraysize($WOE_CONTROL);
    					case 3:
    						mes "[New Session]";
    						mes ((.@d)?"Session added.":"Cancelled.");
    						next;
    						set .@d,1;
    					case 2:
    						break;
    					}
    					if (.@d) { set .@d,0; break; }
    				}
    			}
    			break;
    		case 2:
    			mes "[Remove Session]";
    			if (!.Size) {
    				mes "There are no sessions configured.";
    				next;
    				break;
    			}
    			mes "Select a session to remove.";
    			next;
    			set .@menu$,"";
    			for(set .@i,0; .@i<.Size; set .@i,.@i+4)
    				set .@menu$, .@menu$+" ~ "+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1],1)+"-"+Add_Zero($WOE_CONTROL[.@i+2],1)+"):";
    			set .@menu$, .@menu$+" ~ ^777777Cancel^000000";
    			set .@i, select(.@menu$)-1;
    			if (.@i == (.Size/4)) break;
    			mes "[Remove Session]";
    			mes "Delete ^0055FF"+.Days$[$WOE_CONTROL[.@i*4]]+"'s^000000 session?";
    			mes "This action cannot be undone.";
    			next;
    			set .@j, select(" ~ ^FF0000Delete session...^000000", " ~ ^777777Cancel^000000");
    			mes "[Remove Session]";
    			if (.@j == 2)
    				mes "Cancelled.";
    			else {
    				deletearray $WOE_CONTROL[.@i*4],4;
    				set .Size, getarraysize($WOE_CONTROL);
    				mes "Session deleted.";
    			}
    			next;
    			break;
    		case 3:
    			mes "[Reload Settings]";
    			mes "This will trigger all events related to new session configurations, if any.";
    			if (agitcheck() || agitcheck2()) {
    				mes " ";
    				mes "Be aware that this will disrupt the current WOE session.";
    			}
    			next;
    			set .@i, select(" ~ ^0055FFReload settings...^000000", " ~ ^777777Cancel^000000");
    			mes "[Reload Settings]";
    			if (.@i == 2) mes "Cancelled.";
    			else {
    				set .Init,1;
    				donpcevent "WOE_CONTROL::OnMinute00";
    				mes "Variables have been re-initialized.";
    			}
    			next;
    			break;
    		case 4:
    			mes "[Force Agit End]";
    			if (!agitcheck() && !agitcheck2())  {
    				mes "WOE has already ended.";
    				next;
    				break;
    			}
    			mes "This command will safely execute all AgitEnd events.";
    			mes " ";
    			mes "Kill the current WOE session?";
    			next;
    			set .@i, select(" ~ ^FF0000End session...^000000", ((.Options&1)?" ~ ^FF0000End session without rewards...^000000": ""), " ~ ^777777Cancel^000000");
    			mes "[Force Agit End]";
    			if (.@i == 3)
    				mes "Cancelled.";
    			else {
    				set .ForceEnd, .@i;
    				donpcevent "WOE_CONTROL::OnWOEEnd";
    				mes "WOE session terminated.";
    			}
    			next;
    			break;
    		case 5:
    			set .@d,1; break;
    		}
    		if (.@d) { set .@d,0; break; }
    		} break;
    	case 5:
    		close;
    	} }
    }
    //DUPLICATES
    payon,168,230,4	duplicate(WOE Information)	WOE Information#pay	2_BOARD1
    morocc,149,103,6	duplicate(WOE Information)	WOE Information#moc	2_BOARD1
    alberta,198,149,4	duplicate(WOE Information)	WOE Information#alb	2_BOARD1
    izlude,123,120,6	duplicate(WOE Information)	WOE Information#iz	2_BOARD1
    aldebaran,145,112,4	duplicate(WOE Information)	WOE Information#ald	2_BOARD1
    xmas,151,135,4	duplicate(WOE Information)	WOE Information#xmas	2_BOARD1
    comodo,191,160,4	duplicate(WOE Information)	WOE Information#com	2_BOARD1
    amatsu,191,85,6	duplicate(WOE Information)	WOE Information#ama	2_BOARD1
    gonryun,162,122,4	duplicate(WOE Information)	WOE Information#gon	2_BOARD1
    umbala,90,157,6	duplicate(WOE Information)	WOE Information#um	2_BOARD1
    louyang,211,41,6	duplicate(WOE Information)	WOE Information#lou	2_BOARD1
    lighthalzen,162,100,4	duplicate(WOE Information)	WOE Information#lhz	2_BOARD1
    hugel,93,153,6	duplicate(WOE Information)	WOE Information#hug	2_BOARD1
    rachel,136,119,4	duplicate(WOE Information)	WOE Information#rac	2_BOARD1 

     

    I've not been able to test it as I'm not home today, but there's no error at least


  2. Hi peoples,

     

    I'd like to programatically trigger a specific event of a specific npc.

    I'm really newb to code sourcing, so if anybody can tell me how to do that, I'd be greatly thankfull ^^

     

    Here's the name of the npc and event to call:

     

    alapcusk for the npc unique name, and OnEventTriggered for the event!

     

    I guess it should be something like "npc->event(sd, "alapcusk::OnEventTriggered", 0)", but it didn't worked...

     

    Thanks!


  3. Hi peoples,

     

    I'm currently trying to add custom skills, but encounter an issue I don't quite understand.

     

    I've added 6 skills, from id 1301 to 1306. I did have an error, saying that the id were doubled (while I can't find a clue of where to find them, as they were not used in skill_db.conf).

     

    I've try to take the last entered in this file (10014, skill GD_DEVELOPMENT), and started at 11000 (to let enough space for future adding), the id isn't recognized at all (id 0 when starting map server).

     

    Finally, while reading the guide again, I used the id 8443, which worked for first skill, but 8444 to 8448 for following ones failed with the same error, id allready in use.

     

    Can anybody enlight me? Which id am I supposed to use? Can't give a try to each id between 1300 and 11000...


  4. Hi everybody.

     

    I'm currently trying to write a hooking plugin enabling to hook skill use from players.

    I've hooked (pre) the castend_pos2 and castend_nodamage method, which I've confirmed to be the two I need for my use.

     

    If I use those initial methods to display the infos I need (id, x and y pos), the infos displayed are okay.

    But on the other hand, if use my hooked ones, the castend_nodamage doesn't display the good coordinates.

     

    On top of that, I'd like to add a check for players only, to prevent raise from mob skills.

    But this doesn't work either, I don't get any output of the infos anymore, meaning my check isn't good, but I don't know why.

     

    Can anybody help me?

     

    Here's my code:

     

    
    int skill_castend_nodamage_id_pre(struct block_list *src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag)
    {
    	//ShowInfo( "hook castend nodamage %i/%i", src->type, BL_PC );
    	//	TBL_PC *sd = BL_CAST(BL_PC, src);
    	//if ( src->type == BL_PC || sd ) {
    		ShowInfo(" hook castend nodamage id %i: %i / %i", *skill_id, bl->x, bl->y);
    		ShowInfo(" hook castend nodamage id %i: %i / %i", *skill_id, src->x, src->y);
    	//}
    	return 0;
    }
    
    /* run when server starts */
    HPExport void plugin_init (void) {
    	//init hook
    	ShowInfo("[%s] I'm being run from the '%s' filename\n", SERVER_NAME);
    	addHookPre( skill, castend_pos2, skill_castend_pos2_pre);
    	addHookPre( skill, castend_nodamage_id, skill_castend_nodamage_id_pre);
    }
    
    

    Just to explain, the "sd" was used just in case, as the type must be okay. But as it doesn't, I've used to double check. Doesn't work either...I always get a "hook castend nodamage id 2006: 0 / -10368" (notice that the y may change, but I've never seen anything over than 0 for the x).

     

    Thanks for any help you'd be able to give me!


  5. Hi guys,

     

    I'd like to have some opinion before starting to work on something.

    It's been a long time I didn't work on a server RO, cause I think the game itself start to be a bit...oldish.

    Therefor, I'd like to offer RO universe, without the RO drawbacks we all know for years. And I'd like to have your opinion: is it possible for this idea to be followed by some?

     

    So here's the main ideas:

    -No class (only one, Gangsi or Dark collector as they don't have skills)

    -Skills bound to weapon (skill list depending on the weapon type and level, skills levels depending on weapon refine rate)

    -No Mvp, except in main line

    -Increased crafting possibilities, to fill the lack of mvp lootings

    -Limited lifes (10, with a specific system to regain one).

     

    It'll probably be paired with a progressive system, allowing players to access to area after defeating a Mvp in the main line.

     

    Any opinion? I'd like not to work for nothing ^^'


  6. Actually, there's no such thing as "go back to lvl 1". There's only a jobchange to novice or novice_high, which makes you automatically go back to lvl 1/1.

    You can therefor add a base lvl and job lvl up command after the jobchange to make player return to the desired lvl. On the other hand, they'll have to reuse all their points (stats and skills) manually.


  7. Well as you've seen it, just change the 

     

     

    OnClock0000:
        if ( gettime(5) != 1 ) end;
    L_give:
     

     

    for 

     

     

    OnClock0000:
        if ( gettime(4) != 1 ) end;
    L_give:
     

     

    To make it week based over month based.

    For the reset, yes, it's automatically done when your players will receive the rewards

     

    query_sql "update `char` set mvp_rank = 0"; // reset the ladder
     

     


  8. Can't test it right now, but this should do the job

     

    - script vaporize -1,{
     
    OnPCLoginEvent:
    	addtimer 60000,strnpcinfo(0)+"::On1min";
    	end;
     
    On1min:
    	if(gethominfo(2) != "null"){
    		if(getidle() >= $antiafk) {
    			atcommand "@useskill 244 1 "+strcharinfo(0);
    			dispbottom "You are not allowed to farm with Homun while AFK.";
    			addtimer 60000,strnpcinfo(0)+"::On1min";
    		}
    	}
    	addtimer 60000,strnpcinfo(0)+"::On1min";
    	end;
    	
    OnInit:
    	set $antiafk, 120;// how many seconds to use vaporize
    	end;
    }
    

     

     

     


  9. Well while I have to recognize that I don't really understand the "state" notion, the castles to be activated must be edited in this array, in the oninit section:

     

    setarray .woe_state_0[0],1,0,0,0,0,0,0;

     

    To add more castle into prontera region, change the 1 to the value you want (0, 2, 4, 5...) as it's depicted in the comments

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.