Jump to content

Patskie

Members
  • Posts

    1702
  • Joined

  • Last visited

  • Days Won

    18

Posts posted by Patskie

  1. On your atcommand.cpp

    1. 

    After 

    ACMD_DEF(jailfor)

    Add 

    ACMD_DEF2("pk",pk)

    2. 

    Before 

    ACMD_FUNC(whogm)

    Add

    ACMD_FUNC(pk)
    {
    	
    	nullpo_retr(-1, sd);
    
    	if (map_getmapflag(sd->bl.m, MF_PVP) || map_getmapflag(sd->bl.m, MF_GVG) || map_getmapflag(sd->bl.m, MF_GVG_CASTLE) || map_getmapflag(sd->bl.m, MF_GVG_DUNGEON)) {
    
    		clif_displaymessage(fd, "You can only change your PK state on non-PVP maps.");
    		return -1;
    	}
    
    	if (!sd->state.pk_mode) {
    		sd->state.pk_mode = 1;
    		clif_displaymessage(fd, "You are now no longer in PK mode.");
    	}
    	else {
    		sd->state.pk_mode = 0;
    		clif_displaymessage(fd, "Returned to normal state.");
    	}
    
    	return 0;
    }

     

    On your pc.hpp

    After 

    unsigned int warping : 1

    Add 

    unsigned int pk_mode : 1;

     

    On your battle.cpp

    After

    else if (sd->duel_group && !((!battle_config.duel_allow_pvp && mapdata->flag[MF_PVP]) || (!battle_config.duel_allow_gvg && mapdata_flag_gvg(mapdata))))
    {
    	if (t_bl->type == BL_PC && (sd->duel_group == ((TBL_PC*)t_bl)->duel_group))
    		return (BCT_ENEMY & flag) ? 1 : -1; // Duel targets can ONLY be your enemy, nothing else.
    	else
    		return 0; // You can't target anything out of your duel
    }

    Add

    else if (map_getmapflag(s_bl->m, MF_PVP) && sd->state.pk_mode && t_bl->type != BL_MOB)
    	return 0;

    After

    if( ((sd->state.block_action & PCBLOCK_IMMUNE) || (sc->data[SC_KINGS_GRACE] && s_bl->type != BL_PC)) && flag&BCT_ENEMY )
    	return 0; // Global immunity only to Attacks

    Add

    if (sd->state.pk_mode && flag&BCT_ENEMY && s_bl->type != BL_MOB && map_getmapflag(s_bl->m, MF_PVP))
    	return 0;

    Recompile and re-test

    I cannot create patch today as I am doing something with my Git. So yea do it manually for now ?

    • Upvote 1
  2. You can try 

    prontera,150,150,6	script	Timer	876,{
    	function Time_Left;
    	
    	mes "Hi Pogi";
    	switch(select((a?"":"Initialization")+":"+(!a||b?"":"Stop")+":"+(!a||!b?"":"Start")+":Settings")) {
    		case 1:
    			a = gettimetick(2); // start time
    			addtimer (Time_Left() * 1000), strnpcinfo(0) + "::OnTimeUp";
    			c = Time_Left();
    			break;
    		case 2:
    			b = gettimetick(2); // stop time
    			deltimer strnpcinfo(0) + "::OnTimeUp";
    			break;
    		case 3:
    			c -= b - a;
    			addtimer Time_Left((gettimetick(2) - (b - a)), gettimetick(2), c) * 1000, strnpcinfo(0) + "::OnTimeUp";
    			a = gettimetick(2);
    			b = 0;
    			break;
    		case 4:
    		default: break;
    	}
    	close;
    		
    	OnTimeUp:
    		dispbottom "Done!";
    		a = 0;
    		b = 0;
    		c = 0;
    		end;
    		
    	OnPCLogoutEvent:
    		if (!a || b) end;
    		b = gettimetick(2);
    		end;
    		
    	OnPCLoginEvent:
    		if (!a || !b) end;
    		c -= b - a;
    		addtimer Time_Left((gettimetick(2) - (b - a)), gettimetick(2), c) * 1000, strnpcinfo(0) + "::OnTimeUp";
    		a = gettimetick(2);
    		b = 0;
    		end;
    		
    	OnCmd:
    		if (!a)
    			dispbottom "No timer set";
    		else 
    			dispbottom "Timer Left : " + Time_Left(a, (!b?gettimetick(2):b), (!c?.time_in_seconds:c));
    		end;
    		
    		
    	// start = start time 
    	// end = end time
    	// time limit = remaining time
    	function Time_Left {
    		.@start = getarg(0, 0);
    		.@end = getarg(1, gettimetick(2));
    		.@time_limit = getarg(2, .time_in_seconds);
    		return !.@start ? .time_in_seconds : (.@time_limit - (.@end - .@start));
    	}
    	
    	OnInit:
    		.time_limit = 1; // 3 minutes
    		.time_in_seconds = .time_limit * 60;
    		bindatcmd "timer", strnpcinfo(0) + "::OnCmd";
    		//uncomment below if you want timers to reset upon server restart / npc reload
    		/*addrid(0);
    		a = 0;
    		b = 0;
    		c = 0;
    		deltimer strnpcinfo(0) + "::OnTimeUp";*/
    		end;
    }

    Tho i haven't tested them fully like combination (stop -> logout -> login -> start). Up to you how to debug

    Use @timer

  3. I think your request will not work as getnpctimer(0) and setnpctimer only works as NPC timer. Sure you can attach the timer on multiple players but you cannot get the current tick attached to each players.

    You can use the gettimetick/addtimer/deltimer for this perhaps? You can try below

    prontera,150,150,6	script	Timer	876,{
    	function Time_Left;
    	
    	mes "Hi Pogi";
    	switch(select("Initialization:Stop:Start:Settings")) {
    		case 1:
    			a = gettimetick(2); // start time
    			addtimer (Time_Left() * 1000), strnpcinfo(0) + "::OnTimeUp";
    			break;
    		case 2:
    			b = gettimetick(2); // stop time
    			deltimer strnpcinfo(0) + "::OnTimeUp";
    			break;
    		case 3:
    			.@diff = gettimetick(2) - (b - a);
    			a = b;
    			b = gettimetick(2);
    			addtimer Time_Left(.@diff, b) * 1000, strnpcinfo(0) + "::OnTimeUp";
    			break;
    		case 4:
    		default: break;
    	}
    	close;
    		
    	OnTimeUp:
    		dispbottom "Done!";
    		a = 0;
    		b = 0;
    		end;
    		
    	OnPCLogoutEvent:
    		if (!a) end;
    		b = gettimetick(2);
    		end;
    		
    	OnPCLoginEvent:
    		if (!a) end;
    		.@diff = gettimetick(2) - (b - a);
    		a = b;
    		b = gettimetick(2);
    		addtimer Time_Left(.@diff, b) * 1000, strnpcinfo(0) + "::OnTimeUp";
    		end;
    		
    	function Time_Left {
    		.@start = getarg(0, 0);
    		.@end = getarg(1, gettimetick(2));
    		return !.@start ? .time_in_seconds : (.time_in_seconds - (.@end - .@start));
    	}
    	
    	OnInit:
    		.time_limit = 3; // 3 minutes
    		.time_in_seconds = .time_limit * 60;
    		//uncomment below if you want timers to reset upon server restart / npc reload
    		//addrid(0);
    		//a = 0;
    		//b = 0;
    		end;
    }

    PS : I'm not good at timers also ?

     

  4. *agitcheck()
    *agitcheck2()
    *agitcheck3()
    
    These function will let you check whether the server is currently in WoE:FE mode
    (agitcheck()), WoE:SE mode (agitcheck2()), or WoE:TE mode (agitcheck3()) and will
    return true if War of Emperium is on and false if it isn't.

    You can test and let me know if it doesn't work

  5. OnHour00:
    	if (gettime(DT_DAYOFMONTH) == 1) {
    		// asign top player to a global variable
    		// truncate the tables
    	}
    	end;

    Use below reference to reset the values

    https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html

    *query_sql("your MySQL query"{, <array variable>{, <array variable>{, ...}}});
    *query_logsql("your MySQL query"{, <array variable>{, <array variable>{, ...}}});
    
    Executes an SQL query. A 'select' query can fill array variables with up to 2 billion rows of
    values, and will return the number of rows (i.e. array size) or -1 on failure.
    
    Note that 'query_sql' runs on the main database while 'query_logsql' runs on the log database.
    
    Example:
    	.@nb = query_sql("select name,fame from `char` ORDER BY fame DESC LIMIT 5", .@name$, .@fame);
    	mes "Hall Of Fame: TOP5";
    	mes "1." + .@name$[0] + "(" + .@fame[0] + ")"; // largest fame value.
    	mes "2." + .@name$[1] + "(" + .@fame[1] + ")";
    	mes "3." + .@name$[2] + "(" + .@fame[2] + ")";
    	mes "4." + .@name$[3] + "(" + .@fame[3] + ")";
    	mes "5." + .@name$[4] + "(" + .@fame[4] + ")";

     

  6. -	script	ranking	-1,{
    	function CreateMessage;
    	function CreateMessage {
    		.@a = getarg(0, 0);
    		switch (.@a) {
    			case 0:
    			default:
    				return "No records.";
    			case 1:
    				.@sql$ = "SELECT `NAME`, `ZENY` FROM `CHAR` ORDER BY `ZENY` DESC LIMIT 1";
    				break;
    			case 2:
    				.@sql$ = "SELECT A.`NAME`, B.`AMOUNT` FROM `CHAR` A, `INVENTORY` B WHERE A.`CHAR_ID` = B.`CHAR_ID` AND B.`NAMEID` =  '" + .pods_item_id + "' ORDER BY B.`AMOUNT` DESC LIMIT 1";
    				break;
    			case 3:
    				.@sql$ = "SELECT B.`NAME`, A.`VALUE` FROM `ACC_REG_NUM` A, `CHAR` B WHERE A.`ACCOUNT_ID` = B.`ACCOUNT_ID` AND A.`KEY` = '#CASHPOINTS' ORDER BY A.`VALUE` DESC LIMIT 1";
    				break;
    		}
    		
    		if (query_sql(.@sql$, .@name$, .@value) > 0 && .@value > 0)
    			.@str$ = .@name$ + " - [" + .@value + "]";
    		else
    			.@str$ = "No records.";
    		
    		return .@str$;
    	}
    	end;
    	
    	OnMinute60:
    		delwaitingroom;
    		waitingroom CreateMessage(strnpcinfo(2)), 0;
    		end;
    	
    	OnInit:
    		.pods_item_id = 1001; // put your pods item id
    		waitingroom CreateMessage(strnpcinfo(2)), 0;
    		end;
    }
    
    prontera,152,156,0	duplicate(ranking)	Top Zeny Ranking#1	100
    prontera,155,156,0	duplicate(ranking)	Top Pods Ranking#2	100
    prontera,158,156,0	duplicate(ranking)	Top Cashpoints Ranking#3	100

    Updates every hour. Note of below

    *waitingroom "<chatroom name>",<limit>{,"<event label>"{,<trigger>{,<required zeny>{,<min lvl>{,<max lvl>}}}}};
    ....
    The maximum length of a chat room name is 60 letters.

     

  7. Change

    case 1:
    	callsub S_CheckPVPRoom,@mapcount_1,"guild_vs1";
    	break;
    case 2:
    	callsub S_CheckPVPRoom,@mapcount_2,"guild_vs3";
    	break;
    case 3:
    	callsub S_CheckPVPRoom,@mapcount_3,"pvp_n_8-1";
    	break;
    case 4:
    	callsub S_CheckPVPRoom,@mapcount_4,"pvp_y_1-1";
    	break;

    To 

    case 1:
    	callsub S_CheckPVPRoom,@mapcount_1,"guild_vs1",15;
    	break;
    case 2:
    	callsub S_CheckPVPRoom,@mapcount_2,"guild_vs3",20;
    	break;
    case 3:
    	callsub S_CheckPVPRoom,@mapcount_3,"pvp_n_8-1",30;
    	break;
    case 4:
    	callsub S_CheckPVPRoom,@mapcount_4,"pvp_y_1-1",60;
    	break;

    and then change

    if (getarg(0) >= 25) {

    to 

    if (getarg(0) >= getarg(2)) {

     

  8. Add below item script on all of your "eating items" 

    501,Red_Potion,Red Potion,0,10,,70,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 100,100; HUNGERPOINTS += 8; if (getstatus(SC_SLOWDOWN)) {sc_end SC_SLOWDOWN;} },{},{}

    Then use below script. It will reduce hunger points every 15 minutes. So 8 hunger points from the pots means 2 hours.

    -	script	HungerGames	-1,{
    	OnMinute15:
    	OnMinute30:
    	OnMinute45:
    	OnMinute60:
    		addrid(0);
    		if (!HUNGERPOINTS) {
    			sc_start SC_SLOWDOWN, INFINITE_TICK, 100, 10000, SCSTART_NOAVOID;
    			Hp = 1;
                Sp = 0;
    		} else {
    			HUNGERPOINTS--;
    			dispbottom "Your hunger points have been reduced. Hunger points total : " + HUNGERPOINTS;
    		}
    		end;
    }

     

  9. -	script	qwerty	-1,{
    	OnPCLoadMapEvent:
    		if (getgmlevel() > 98) end;
    		if (agitcheck() || agitcheck2() || agitcheck3()) {
    			.@s$ = implode(.m$, ",");
    			if (compare(.@s$, strcharinfo(3)))
    				warp "SavePoint",0,0;
    		}
    		end;
    	
    	OnInit:
    		setarray .m$[0], "prtg_cas01", "prtg_cas02", "prtg_cas03";
    		.s = getarraysize(.m$);
    		.@i = 0;
    		while (.@i < .s) {
    			setmapflag .m$[.@i], mf_loadevent;
    			.@i++;
    		}
    		end;
    }
    

     

    • Love 1
  10. Try changing

    case 0:
    	instance_announce 0, strcharinfo(0)+" from party, " +getpartyname( .@party_id )+", is entering the dungeon, "+.instance_name$+".",bc_map,"0x00ff99",FW_NORMAL,12;
    	end;

    To

    case 0:
    	instance_announce instance_id(IM_PARTY), strcharinfo(0)+" from party, " +getpartyname( .@party_id )+", is entering the dungeon, "+.instance_name$+".",bc_map,"0x00ff99",FW_NORMAL,12;
    	end;

     

  11. prontera,150,150,0	script	Party Warper	100,{
    	if (!getcharid(1)) end;
    	.@c = getcharid(0);
    	getpartymember getcharid(1), 0;
    	getpartymember getcharid(1), 1;
    	getpartymember getcharid(1), 2;
    
    	for (.@i = 0; .@i < $@partymembercount; .@i++)
    		.@menu$ = .@menu$ + (strcharinfo(0) != $@partymembername$[.@i] ? $@partymembername$[.@i] : "") + ":";
    
    	.@s = select(.@menu$) - 1;
    	if (isloggedin($@partymemberaid[.@s], $@partymembercid[.@s])) {
    		attachrid($@partymemberaid[.@s]);
    		getmapxy .@map$, .@x, .@y;
    		warp .@map$, .@x, .@y, .@c;
    	}
    	end;
    }

     

  12. Try this 

    prontera,150,150,0	script	PVP Warper	100,{
    	mes .npc$;
    	mes "Hi, Where do you want to go?";
    	next;
    	for (.@i = 0; .@i < .size; .@i++)
    		.@menu$ = .@menu$ + .maps$[.@i] + " - [" + getmapusers(.maps$[.@i]) + "/" + .max + "]:";
    	.@s = select(.@menu$);
    	.@map$ = .maps$[.@s-1];
    	if (getmapusers(.@map$) < .max)
    		warp .@map$,0,0;
    	else {
    		mes .npc$;
    		mes "The room is full";
    	}
    	close;
    	
    	OnInit:
    		.npc$ = "[" + strnpcinfo(1) + "]";
    		.max = 15; // max number of allowed players
    		setarray .maps$[0],
    			"guild_vs1",
    			"guild_vs2",
    			"guild_vs3"; // set your maps here
    		.size = getarraysize(.maps$);
    		for (.@i = 0; .@i < .size; .@i++) {
    			setmapflag .maps$[.@i], MF_PVP;
    			setmapflag .maps$[.@i], MF_NOITEMCONSUMPTION;
    		}
    		end;
    }

     

  13. You can try 

     

    prontera,150,150,0	script	Monster Of The Day	835,{
    	end;
    		
    	OnNPCKillEvent:
    		if (getmonsterinfo(killedrid, MOB_NAME) != .motd$) end;
    		.@party_id = getcharid(1);
    		.map$ = strcharinfo(3);
    		if (!.@party_id && rand(100) < .chance) {
    			BaseExp += .base_exp_bonus;
    			JobExp += job_exp_bonus;
    			Zeny += .zeny;
    			getitem .item, 1;
    		} else {
    			addrid(2, 0, .@party_id);
    			if (strcharinfo(3) == .map$ && Hp && rand(100) < .chance) {
    				BaseExp += .base_exp_bonus;
    				JobExp += .job_exp_bonus;
    				Zeny += .zeny;
    				getitem .item, 1;
    			}
    		}
    		end;
    	
    	OnClock0000:
    		.motd$ = .mobs$[rand(getarraysize(.mobs$))];
    		delwaitingroom;
    		waitingroom "[MOTD] " + .motd$, 0;
    		announce "Monster of the day has been changed. New monster of the day is " + .motd$, 0;
    		end;
    	
    	OnInit:
    		.zeny = 1000; // zeny reward
    		.item = 1000; // item reward
    		.job_exp_bonus = 1000; // base exp bonus
    		.base_exp_bonus = 1000; // job exp bonus
    		setarray .mobs$[0], "Scorpion", "Poring", "Fabre"; // mob names
    		.chance = 100; // chance to get bonus
    		.motd$ = .mobs$[rand(getarraysize(.mobs$))];
    		delwaitingroom;
    		waitingroom "[MOTD] " + .motd$, 0;
    		announce "Monster of the day has been changed. New monster of the day is " + .motd$, 0;
    		end;
    }

     

×
×
  • Create New...