Jump to content

Patskie

Members
  • Posts

    1702
  • Joined

  • Last visited

  • Days Won

    18

Everything 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 ?
  2. https://github.com/rathena/rathena/wiki/Adding-a-Script
  3. 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
  4. 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 ?
  5. You need to include attachnpctimer before initnpctimer to apply it only on players who talk to your npc.
  6. *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
  7. if (!countitem(501) || agitcheck() || agitcheck2() || agitcheck3() || getmapflag(strcharinfo(3), mf_gvg)) end;
  8. 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] + ")";
  9. - 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.
  10. - script asdqwe -1,{ OnPCDieEvent: if (!countitem(501)) end; delitem 501, 1; specialeffect 77; atcommand "@alive"; end; } Change 501 to your item id
  11. 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)) {
  12. 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; }
  13. Change to whatever map you want set $pvp$[0],"guild_vs3";
  14. - 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; }
  15. Patskie

    Quarantine

    How does the quarantine goes to your country? ? PS : What a way to see rAthena again after so long. Thanks to massive lock down in PH ?
  16. 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;
  17. 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; }
  18. 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; }
  19. Change all getmapxy( .@map$,.@x,.@y,1 ); to getmapxy( .@map$,.@x,.@y,BL_NPC );
  20. 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...