Jump to content

Mastagoon

Members
  • Posts

    63
  • Joined

  • Last visited

  • Days Won

    5

Posts posted by Mastagoon

  1. WoE Rewards & Statistics


    This file is a different version from WoE rewards depending on time spent in castle. It has all the features listed there, plus a statistic rundown on each WoE, And the ability to track the damage dealt by each player during WoE.

    Features:

    • Can reward players for every minute they spend inside a WoE castle
    • Can reward players for every kill in WoE castle, and will also display the name of the killed/killer.
    • Can reward players for every emperium break during WoE
    • Can reward players depending on the damage dealt during WoE
    • Excludes AFK players and players who are not in a guild.
    • Announces kills with different colors depending on the killer's castle
    • Can set a modifier for certain classes to gain more points than others
    • Displays the number and names of all the guilds who participated in the last WoE
    • Displays a top 10 ranking of players with the most kills, K/DA, and Damage dealt during WoE

     

    • Upvote 1
    • Love 1
  2. OnPCAttackEvent


    This event triggers when a player character attacks another entity. And it registers the damage and other information about the attack.

    Example usage:

    // @damage holds the amount of damage dealt.
    // @damagegid holds the GID of the target (account ID if the target is a player).
    // @damagerid holds the rid of the mob
    OnPCAttackEvent:
    	dispbottom "You've dealt "+@damage+" to target with GID "+@damagegid+" and RID "+@damagerid;

     


     

    • Upvote 1
  3. 46 minutes ago, AinsLord said:

    very much thank you i do really appreciate this ❤️

    edit:

    @Mastagoon i got this error showing on my console

    image.png.b885cdf2c993612e1c229e24f0d593d4.png

    here was the script i edit i dunno if i put it on wrong place

    but i followed the instructions

    
    //===== rAthena Script ======================================= 
    //= Find the gm event (hide and seek)
    //===== By: ==================================================
    //= Mastagoon
    //===== Description: =========================================
    //= The npc (GM sprite) will teleport to a random location on
    //= the map, and will open a waiting room. The first player to
    //= join that waiting room will win the round.
    //===== Current Version: =====================================
    //= 1.0
    //===== Featuers: ============================================
    //= Can set the number of rounds, map, item&zeny rewards.
    //= the event can start manually or automatically.
    //= There is another version of this script compatiable with 
    //= Stolao's event manager. You can DM me if you want that file.
    //============================================================
    alexandria,166,155,4	script	GM Masta#findgm	871,{
    	if(.status < 2) {
    		mes "["+.npcName+"]";
    		mes "When the event begins, i will teleport to a random location on this map.";
    		mes "And you need to find me to win!";
    		close;
    	}
    	end;
    
    OnInit:
        //SETTINGS
    	.rounds = 5; // for how many rounds should the event last?
        .map$ = "prontera"; // the event where the gm will hide
        setarray .maps$[0], 'prontera', 'izlude', 'geffen';
        .itemReward = 1;  
        setarray .rewards[0],6379,5,7227,5;   // [itemId, itemAmount, {....}]
        .zenyReward = 0;
        .zenyAmount = 10000;
        .debugMode = 0;
        .npcName$ = "GM Kiks";
        .countdown = 3; // the time between event announcements and when the event actually starts.
    	.automatic = 1;	// automatic event or does it need a gm to run it manually?
    	.runEvery = 3;	// (ignore if manual) run the event ever X hours 
    	.offset = 1;	// (ignore if manual) sometimes, you might have another event/announcement at the same time as the event announcement. you can set an offset (announce X minutes after event time.)
        // Do not edit the code below.
        if(.countdown < 0) .countdown = 1;
        if(.rounds < 1) .rounds = 1;
        if(.winnersPerRound < 1) .winnersPerRound = 1;
    	for(.@i = 0; .@i < getarraysize(.rewards); .@i = .@i+2) {
    		if(getitemname(.rewards[.@i]) == "null") {
    			debugmes "[Find GM]: Invalid item id provided "+.rewards[.@i]+" removing item from the rewards list..";
    			deletearray .rewards[.@i],2;
    			.@i -= 2;
    		}
    	}
        .status = 0;
        bindatcmd("eventstart", strnpcinfo(3)+"::OnEventAnnounce",60,99);
    	strnpcinfo(3);
    	end;
    
    OnMinute00:
    	if(.status || !.automatic || gettime(DT_HOUR) % .runEvery != 0 || agitcheck() || agitcheck2() || agitcheck3()) end;
    	sleep .offset * 1000 * 60;
    
    OnEventAnnounce:
    	.status = 1;
    	for(.@i = .countdown; i > 0; i--) {
        	announce "[Find "+.npcName$+"] : The event will begin in "+callfunc("F_InsertPlural",.@i,"minute")+"!",bc_all|bc_blue;
    		sleep .debugMode ? 5000 : 60000;
    	}
    	announce "[Find "+.npcName$+"] : The event has now begun!",bc_all|bc_blue;
    
    OnEventStart:
    	.map$ = .maps$[rand(getarraysize(.maps$))];
    	sleep 2000;
    	npctalk "I will now teleport to a random location";
    	sleep 2000;
    	npctalk "You must find me to win the event!";
    	sleep 2000;
    	npctalk "This event will last for "+callfunc("F_InsertPlural",.rounds,"round");
    	sleep 2000;
    	npctalk "Goodluck!";
    	donpcevent strnpcinfo(3)+"::OnRoundStart";
    	.status = 2;
    	.round = 1;
    	end;
    
    OnRoundStart:
    	initnpctimer;
    	do {
    		.@x = rand(0,450);
    		.@y = rand(0,450);
    	} while (!checkcell(.map$,.@x,.@y,cell_chkpass));
    	unitwarp getnpcid(0),.map$,.@x,.@y;
    	debugmes "[Event]: npc is at: "+.@x+" & "+.@y;
    	announce "[Find "+.npcName$+"] :"+.npcName$+" is hiding in a random place in "+.map$+", Find him now!",bc_all|bc_blue;
    	delwaitingroom;
    	waitingroom "Here!", 2, strnpcinfo(3)+"::OnRoundEnd",1;
    	.status = 2;
    	end;
    
    OnRoundEnd:
    	if(.status != 2) end;
    	.status = 1; 
    	//#TODO the winner should be already attached here no?
    	getwaitingroomusers strnpcinfo(3);
    	for(.@i = 0; .@i < getarraysize(.@waitingroom_users); .@i++) {
    		if(.@waitingroom_users[.@i] > 0) {
    			.@winner = .@waitingroom_users[.@i];
    		}
    	}
    	if(!attachrid(.@winner)) {
    		.status = 2;
    		end;
    	}
    	specialeffect2 EF_SPHERE;
    	announce .npcName$+": I've been found by "+strcharinfo(0)+"!",bc_all|bc_blue;
    	if(.itemReward) {
    		for(.@i = 0; .@i < getarraysize(.rewards); .@i = .@i +2) {
    			getitem .rewards[.@i],.rewards[.@i+1];
    		}
    	}
    	if(.zenyReward) {
    		Zeny += .zenyAmount;
    		dispbottom "You've gained "+.zenyAmount+" zeny for winning a round in the event.";
    	}
    	sleep 1000;
    	if(.round >= .rounds) {
    		donpcevent strnpcinfo(3)+"::OnEventEnd";
    		end;
    	}
    	.round++;
    	donpcevent strnpcinfo(3)+"::OnRoundStart";
    	end;
    
    OnEventEnd:
    	.status = 0;
    	announce "[Find "+.npcName$+"]: The event is over! thank you for participating.",bc_all|bc_blue;
    	unitwarp getnpcid(0),.map$,195,58;
    	delwaitingroom;
    	sleep 5000;
    	end;
    
    OnTimer1800000:
    	if(.status) {
    		stopnpctimer;
    		donpcevent strnpcinfo(3)+"::OnEventEnd";
    	}
    	end;
    }

    thanks again

    use "" instead of ''

    "prontera", "izlude", "geffen", ...etc

  4. 2 hours ago, AinsLord said:

    @Radian in addition to this post

    how can i add additional maps where the NPC hide like randomly

    i was trying to put

    
    .map$ = "prontera"||"izlue"; // the event where the gm will hide

    im getting error

    Keep the .map$ line as it was. Then add below it:

    setarray .maps$[0], 'prontera', 'izlude', 'geffen';

    Then, right below the OnEventStart label, add this line:

    .map$ = .maps$[rand(getarraysize(.maps$))];

    Now the map will be randomly chosen each time.

    goodluck.

  5. announce "Player "+strcharinfo(0)+" Enters the PvP Room.",bc_all|bc_blue;

    The line above announces it to the entire server. You want this line right above the warp script.

    To make the announcement only inside the pvp room:

    mapannounce strcharinfo(3),"Player "+strcharinfo(0)+" Enters the PvP Room.",bc_map|bc_blue;

     

    • Upvote 1
  6. 8 minutes ago, umbraqueen said:

    I tried, but when i did i had a bunch of error in the server console at startup, and i wasnt able to allocate any point in the skill tree. Is there something special i must do once i have put all skill to 0 cooldown?

    Remove the Cooldown line or comment it out from the file. 

    If you got an error please share it to help us figure out what's wrong

  7. Here's one solution:

    In script.inc. Add this function at the end of the file:

    BUILDIN_FUNC(logout_tick)
    {
    	TBL_PC *sd;
    	if (!script_rid2sd(sd)) {
    		script_pushint(st, -1);
    		return SCRIPT_CMD_FAILURE;
    	}
    	if (sd->canlog_tick == 0)
    		script_pushint(st, 0);
    	else
    		script_pushint(st, DIFF_TICK(gettick(), sd->canlog_tick));
    	return SCRIPT_CMD_SUCCESS;
    }

    in script_def.inc. Add this line at the end of the file:

    BUILDIN_DEF(logout_tick, ""),

    Then recompile your server.

    This script command will check for the same timer used to check if a player can log out or not. Basically it returns how many milliseconds ago was the character in combat.

    Example usage:

    -	script	testscript	-1,{
    OnInit:
    	bindatcmd("testcmd", strnpcinfo(3)+"::OnAtCmd");
    	end;
    
    OnAtCmd:
    	.@tick = logout_tick();
    	dispbottom "You have been in combat "+.@tick/1000+" seconds ago.";
    	if(.@tick >= 5000 || .@tick == 0)
    		dispbottom "Command used successfully!";
    	else 
    		dispbottom "You cannot use this command if you have been in combat during the last 5 seconds.";
    	end;
    }

    Result:

    413241325.thumb.png.1db414ecc14ff936060e491d3a29147b.png

    • Upvote 1
  8. What client version are you using? and is it hexed ? if so please share your NEMO hex profile.

    Seems like a client-side problem. Basically your server is not receiving the correct packets from the client. I don't have alot of expertise in this area, but first you should make sure the client version you're using matches the PACKETVER constant on your server side.

  9. 9 hours ago, hannahhaven621 said:

    i did a clean up of the script however i have experienced an issue when the item in your inventory is greater than what you have from your restock list. what happens is that a negative amount of item is dropped from the player. 
    this version does not need the ticket however it only works whenever you are in town.
    EDIT:
    v1.2 with the function to prevent the error when the items in your inventory is greater than that of your re-stock list.
     




     

    
    //===== rAthena Script ======================================= 
    //= @restock command
    //===== By: ==================================================
    //= Mastagoon
    //===== Description: =========================================
    //= @restock command to get certain items from your storage
    //===== Current Version: =====================================
    //= 1.0
    //= 1.1 added town only and clean up on some of the code.
    //= 1.2 added an if function when your items in your inventory is greater than the items from your stock list<hannahhaven621>
    //===== TODO: ================================================
    //=	@restock SNAPSHOT
    //============================================================
    -	script	restock_atcmd	-1,{	
    function	addSpace	{
    	set .@space$, "";
    	for(.@i = 1; .@i <= getarg(0); .@i++) {
    		set .@space$, .@space$+" ";
    	}
    	return .@space$;
    }
    
    function	showRestockHelp	{
    	dispbottom "Command Usage : ";
    	dispbottom "@restock add <itemid> <quantity> : add item to restock list";
    	dispbottom "@restock remove <itemid> : remove item from restock list";
    	dispbottom "@restock list : show current restock list";
    	dispbottom "@restock reset : reset restock list";
    	dispbottom "@restock help/h : show this help menu";
    	dispbottom "@restock : get restock items from the storage.";
    }
    
    OnInit:
    	.TicketID = -1;
    	setarray .allowedtypes[0],0,1,2,3,7,8,9,10,11,12; //healing,usable,etc,delayed usable
    	bindatcmd "restock",strnpcinfo(3)+"::OnAtcommand";
    	end;
    
    OnAtcommand:
    	switch(.@atcmd_numparameters) {
    		case 0:	// @restock command
    			if(getarraysize(RestockList) == 0) {
    				dispbottom "Your restock list is empty.";
    				end;
    			} 
    			if(!getmapflag(strcharinfo(3),mf_town,0)) {
    				dispbottom "You can only use this command inside Towns.";
    				end;			
    			}	
    			for(.@i = 0; .@i < getarraysize(RestockList); .@i++) {
    				.@amount = RestockAmountList[.@i] - countitem(RestockList[.@i]);
    				if(!storagecountitem(RestockList[.@i])  > .@amount)  {
    					dispbottom "@restocking "+getitemname(RestockList[.@i])+" failed, your item in your inventory is greater than your restock list.";
    				close;
    				}
    				if(storagecountitem(RestockList[.@i])  >= .@amount) {
    					getitem RestockList[.@i],.@amount;
    					storagedelitem RestockList[.@i],.@amount; // successful @restock
    				}
    					else {
    					dispbottom "@restocking "+getitemname(RestockList[.@i])+" failed, not enough in storage.";
    				}
    			}
    			break;
    		case 1:
    			if(strtolower(.@atcmd_parameters$[0]) == "list") { // get restock list
    				if(getarraysize(RestockList) == 0) {
    					dispbottom "Your restock list is empty.";
    					end;
    				}
    				dispbottom "ID"+addSpace(32)+"Name"+addSpace(32)+"Quantity";
    				dispbottom "============================================";
    				for(.@i = 0; .@i < getarraysize(RestockList); .@i++) {
    					.@item_name$ = getitemname(RestockList[.@i]);
    					dispbottom RestockList[.@i]+addSpace(30-getstrlen(.@i+""))+.@item_name$+addSpace(36-
    					getstrlen(.@item_name$))+RestockAmountList[.@i];
    				}
    			} else if(strtolower(.@atcmd_parameters$[0]) == "reset") {	// reset restock list
    				deletearray RestockList[0],getarraysize(RestockList);
    				deletearray RestockAmountList[0],getarraysize(RestockAmountList);
    				dispbottom "Your restock list have been reset.";
    			} else if(strtolower(.@atcmd_parameters$[0]) == "help" || strtolower(.@atcmd_parameters$[0]) == "h") {
    				showRestockHelp();
    			}
    			break;
    		case 2:
    			if(strtolower(.@atcmd_parameters$[0]) != "remove") {
    				showRestockHelp();
    				end;
    			}
    			.@item = atoi(.@atcmd_parameters$[1]);
    			if(getitemname(.@item) == "null") {
    				dispbottom "@restock : This item dones not exist. (id "+.@item+")";
    				end;
    			}
    			.@index = inarray(RestockList, .@item);
    			if(.@index == -1) {	//item is not in the list
    				dispbottom "@restock : This item is not on your restock list.";
    				end;
    			}
    			deletearray RestockList[.@index],1;
    			deletearray RestockAmountList[.@index],1;
    			dispbottom "@restock: item "+getitemname(.@item)+" deleted succesfully!";
    			break;
    		case 3:
    			.@item = atoi(.@atcmd_parameters$[1]);
    			.@quantity = atoi(.@atcmd_parameters$[2]);
    			if(strtolower(.@atcmd_parameters$[0]) != "add" || !.@item || !.@quantity) {
    				dispbottom "@restock : Invaild parameters.";
    				showRestockHelp();
    				end;
    			}
    			if(getitemname(.@item) == "null"){
    				dispbottom "@restock : This item does not exist. (id "+.@item+")";
    				end;
    			} else if(inarray(.allowedtypes[0],getiteminfo(.@item,2)) == -1) {
    				dispbottom "@restock : You cannot restock this type of items.";
    				end;
    			} else if(inarray(RestockList[0],.@item) >= 0) {
    				dispbottom "@restock : Item '"+getitemname(.@item)+"' (id:"+.@item+") already in list.";
    				end;
    			} else if(.@quantity < 1 || .@quantity > 500) {
    				dispbottom "@restock : Please enter valid quantity value (1 - 500)";
    				end;
    			}
    			//passed all checks
    			setarray RestockList[getarraysize(RestockList)],.@item;
    			setarray RestockAmountList[getarraysize(RestockAmountList)],.@quantity;
    			dispbottom "@restock : Item '"+getitemname(.@item)+"' (id:"+.@item+") amount "+.@quantity+" successfully added!";
    			break;
    		default:
    			showRestockHelp();
    			break;
    	}
    	end;
    }

     

    Thank you for your contribution ❤️ . I have updated the file and added a few options.

  10. I'm assuming you mean the 5 second window where you cannot regain SP from any sources after using Asura strike.

    It would be much simpler to just add a 5 seconds cooldown to the skill istelf:

    Find the entry for MO_EXTREMITYFIST inside db/pre-re/skill_db.yml and add a 5 seconds cooldown like so:

     HitCount: 1
     CopyFlags:
       Skill:
         Plagiarism: true
         Reproduce: true
     CastCancel: true
     Cooldown: 5000 <<<<<<<<<< add this line
     CastTime:
     ....

    However if you want the skill to behave like renewal, you need to do the following:

    pc.cpp: search for this line and edit it like this:

    //#ifdef RENEWAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< comment or remove this line
    		if (sd->sc.data[SC_EXTREMITYFIST2])
    			sp = 0;
    //#endif< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  comment or remove this line

    script_constants.hpp:

     search for SC_EXTREMITYFIST2 and edit this line:

    //#ifdef RENEWAL <<<<<<<<<<< comment or remove this line
    	export_constant(SC_EXTREMITYFIST2);
    //#endif  <<<<<<<<<<< comment or remove this line

    script.cpp:

    search for SC_EXTREMITYFIST2 and edit this line:

    //#ifdef RENEWAL
    	if( sd->sc.data[SC_EXTREMITYFIST2] )
    		sp = 0;
    //#endif

     

    skill.cpp, status.hpp, status.cpp:

    basically you want find every occurrence of SC_EXTREMITY_FIST2 and remove the renewal condition check from it. There should be 7 occurrences inside skill.cpp, and 1 in status.hpp & status.cpp

     

    Recompile and start your server and the skill's 5s SP debuff will be active just like in renewal.

     
  11. 1 hour ago, AinsLord said:

    i tried but i got this error

    image.png.9373877ce95121e451e870b3b19f5ffe.png

    Sorry for the delay, here's the correct code:

    -	script	maintown	-1,{
    OnInit:
    	bindatcmd "maintown",strnpcinfo(3)+"::OnAtcommand";
    	end;
    
    OnAtcommand:
        if(gettimetick(2) < cooldowntime) {
            dispbottom "Please wait "+(cooldowntime - gettimetick(2))+" seconds.";
        	end;
        }
    	atcommand "@warp prontera 158 144";
        set cooldowntime, gettimetick(2) + 5;
    	end;
    }

    image.png.e029abba52199f14141b6c3b75e5d3e6.png

    • Upvote 1
  12. Untested

    -	script	maintown	-1,{
    OnInit:
    	bindatcmd "maintown",strnpcinfo(3)+"::OnAtcommand";
    	end;
    
    OnAtcommand:
            if(gettimetic(2) < cooldowntime) {
                  dispbottom "Please wait "+(cooldowntime - gettimetic(2)) / 1000+" seconds.";
                  end;
            }
    	atcommand "@warp alexandria 158 144";
        set cooldowntime, 5000;
    	end;
    }

     

  13. To make them work like a normal warp, use the OnTouch label.

     You want to place this right above your warp command like this:

    OnTouch:
    warp "sch_gld",97,196;
    end;

    You must also specify the range of your NPC's no touch event on its first line:

    Warp NPCs usually have a 2x2 range.

    sch_gld,89,205,0    script    Left Portal    723,2,2{	// 2x2 range
    sch_gld,89,205,0    script    Left Portal    723,4,4{	// 4x4 range
    sch_gld,89,205,0    script    Left Portal    723,6,6{	// 6x6 range
     
  14.  

    Add the option to set a threshold for announcement inside onInit, and then check for it whenever someone wins a reward:

    OnInit:

    setarray .p132131,100,   19827,1,1,  5335,1,1,   32041,1,2832091,1,2832092,1,2832093,1,2832040,1,287517,1,70;  // Gold Coin
    announce_threshold = 5;        // <<<<<<<<<<<<<<< ADD THIS LINE
     
    Inside your code:
    mes "You got ^FF00CC"getd".p".@s +"["+( 1+3*.@r -1 )+"]" ) +" "getitemnamegetd".p".@s +"["+ (13*.@r -2) +"]" ) ) +"^000000";
     if(getd".p".@s +"["+ (13*.@r) +"]" ) <= .announce_threshold
            announce "Player "+strcharinfo(0)+" Has won "+getd".p".@s +"["+( 1+3*.@r -1 )+"]" ) +" "getitemnamegetd".p".@s +"["+ (13*.@r -2) +"]" ) )+" From the Gacha!";
  15. Hello everyone.

    It's been a crazy past month for me, and I wasn't able to update this thread. However, The development of this project is almost complete ~

    Updates

    Mostly I've been working on bugfixes and code optimization, so there's not many new features more than the ones listed above.

    This project has been renamed to Ragnabot (Creative, i know), I've also refactored most of the codebase. I've also set up an API  to format or generate data (I.E, Trivia questions/answers) and send it back to the discord bot client.

    Also you can now set aliases(shortcuts) for commands. so !monster !mob !mi !mobinfo all work as the same command.

    Logs

    Spoiler

     

    • Improved the way Ragnabot displays log messages.
    • Added a config option to choose which logs will be displayed.
    • Colors!

    image.png.1e228656052641ce6d901aa810315c4d.png

     

     

    Configuration

    Spoiler

     

    • Added a general configuration file to set everything up and/or change it easily.

    This includes options to:

    • Specifying the "Admins" who can use administrative commands.
    • Setting the bot's Discord activity and command prefix
    • Setting up language files
    • Setting rewards and various options for the trivia/disguise/bossfight events

    image.png.40692f5392c512a769c14a3f20a10b8c.png

     

     

    Language and Localization

    Spoiler

     

    Streamlined the addition of new languages. All you need to do is create a new language file and add it to the configurations

    If you've used FluxCP's Localization before, this might look familiar.

    image.thumb.png.0d912030b33c81d61cc29e1bb8be3284.png

     

     

    Auction

    Spoiler

     

    • Updated the Auction to accept slotted / enchanted items.
    • Can now accept multiple items to be auctioned at once.
    • Prevented players from flooding the auction channel (messages will be deleted automatically).
    • You can just drag & drop the item you want to auction (just like NPC item selling)
    • Added options to set the time limit of your auctioned item.
    • Added options to set a minimum bid for your auctioned item.
    • Changed the display of auctioned items on discord to look more neat and organized. The color at the left edge of the auction message represents time remaining before the auction expires (The color starts as red and gradually turns to green as the auction duration expires)
    • Changed the order of auction items to show items that are closer to expiration last.

    auction1.thumb.gif.446c3b5ad55fac9e5e25e8d4fd021146.gifref.png.ba39b25b0315b1429dad9e521b253f47.pngauction2.gif.7a676ed709bf25b405432ccd25519467.gif

     

     

    Item/Monster Lookup

    Spoiler
    • Ragnabot can now generate a local Item Database from a iteminfo.lua file. This makes searching for items much much faster, and allows searching for items that are custom and not official.
    • When there's multiple search results, You can  now browse through all the candidate items instead of just displaying links for these items (Inspired by SMRO's moon boot).
    • Monster search now also shows the monster drops and their most common spawn locations (need to work more on this one, doesn't look good tbh)

    504680414_@itembrowser.thumb.gif.3cff52501d1e5010a8a61b05c7063714.gif742071458_@mibrowser.thumb.gif.3d39fba68759fea55cb496b5b61f3443.gif

     

    Whosell Command

    Spoiler
    • This command replaces the old vendors command. It searches the vendors for an item and displays all who vend the particular item.

    ws1.png.24ef942b6f2ae076b5533ae8cf29748b.png

    739068343_ws2.png.a192719a4ab9989b147a627f81f78815.png

     

    TODO

    Spoiler
    • Websocket (to allow #channel to discord channel communication, and giving rewards at real-time. Can also ban players or mute them directly from discord)
    • Whobuys command
    • More items and effects for the Bossfight event
    • More questions for the trivia event (current count: 218. Also you can DM me if you need this API ; ) ) 
    • ??? any cool suggestions

     

    Release

    You can expect a release hopefully very soon. You will be able to Buy Ragnabot as a one-time purchase, or as a monthly subscription.

    I'm also planning on adding a free trial and paritally release some of the features for free

    Thank you for your support on this thread and DMs. Have a good day ❤️

     

    • Love 1
  16. Hi everyone

    Now I used to play PvP all the time in classic and early renewal. But unforutnately PvP in RO is extremely unbalanced not really that great, especially in Renewal.

    So I came up with the idea to take a different approach to PvP, and today I'll share with you three PvP modes that I created.

    Some of these modes require source modification, but alot of the mechanics can be achieved with scripts only, I hope you enjoy ; )

     

    PvP Mode: Abracadabra

    Spoiler

    This pvp mode is more focused toward having a fun experience rather than competition.

    Rules: 

    • In this mode, players can only use the skills Abracadabra, Sight, and Hiding.
    • Abracadabra does not consume yellow gemstones on cast inside the map.
    • All players will have their hotkeys replaced with the skills mentioned above (Upon leaving the PvP map, your hotkeys will be restored).
    • All players will have their gears unequipped, and they cannot re-equip them inside (Although your gear will be re-equipped when you leave the map).
    • All external buffs, homunculi, wargs/falcons will be removed, and your stats will be reset to 1.
    • All consumable items cannot be used.
    • The damage of all skill cast through abracadabra is multiplied for up to 50 fold.

     

    Gameplay video (old):

     

    PvP Mode: Rapidfire

    Spoiler

    Inspired by League of Legends URF mode, this pvp mode allows players to spam all their skills and come up with creative builds that would work in normal PvP.

    Rules:

    Players in this mode will recieve the following effects:

    • -100% Variable and fixed Cast Time.
    • -90% Skill After cast delay.
    • -85% Cooldown on all skills.
    • Attack speed will be set to 193.
    • Skills usage will not consume any SP (unless the skill itself uses SP, like Asura Strike)
    • All consumable items cannot be used.
    • Damage from all sources is reduced by 90%.
    • Players recover 20% of their max HP every 10 seconds.
    • Killing another player will restore 100% of your HP.

    Gameplay video:

     

     

    PvP Mode: Biohazard

    Spoiler

    Players in this mode will be transformed into one of the 13 Bio Lab monsters randomly, and their skills and stats will be changed according to the transformation.

    Each one of the 13 playable characters has some strength and weaknesses, knowing and exploiting these weaknesses is the key to victory.

    In this mode, there's only 4 possible types of debuffs (Stone curse, Freezing, Stun, Silence) and each Character has a certain resistance against these statuses.

    For example, Players who turn into Lord Knight Seyren will have a very high movement speed , HP, and base ATK. but will be vulnerable to freeze and stone curse effects. But players who turn into High Priest Margreta will be immune to freeze and stone effects and have lower HP value.

     

    Rules:

    • In this mode, players can only use the five skills they get depending on their transformation.
    • Skills that normally need specific equipment to use will bypass their requirements (so you can use autoguard without a shield, arrow shower without a bow, etc..)
    • All players will have their hotkeys replaced with the skills mentioned above (Upon leaving the PvP map, your hotkeys will be restored).
    • All players will have their gears unequipped, and they cannot re-equip them inside (Although your gear will be re-equipped when you leave the map).
    • All external buffs, homunculi, wargs/falcons will be removed, and stats will be reset to a certain value depending on the transformation.
    • The maximum HP of each player will be set to a certain value depending on their transformation.
    • All consumable items cannot be used.
    • Killing another player fully restores your HP.
    • Players will be warped out immediately after death.
    •  

    List of playable characters:

     

    High Wizard Katrinn:

    Skills available: Frost Diver, Jupitel Thunder, Storm Gust, Lord Varmilion, Mystical Amplification

    MaxHP: 50,000 (lowest)

     

    Professor Celia:

    Skills available: Double Casting, Wall of Fog, Stone Curse, Firebolt, Spider Web

    MaxHP: 70,000

     

    Lord Knight Seyren:

    Skills available: Bash, Magnum Break, Charge Attack, Provoke, Berserk

    MaxHP: 140,000

     

    Paladin Randel:

    Skills available: Autoguard, Reflect Shield, Shield Charge, Holy Cross, Grand Cross

    MaxHP: 180,000 (Highest)

     

    High Priest Margreta:

    Skills available: Safety Wall, Pneuma, Lex Divina High Heal, Holy Elemental Attack

    MaxHP: 80,000

     

    Champion Chen:

    Skills available: Chain Combo, Combo Finish, Tiger Fist, Chain Crush Combo, Ruwach  

    MaxHP: 90,000

     

    Assassin Cross Eremes:

    Skills available: Cloaking (lvl2), Venom Splasher, Meteor Assault, Soul Destroyer, Sonic Blow

    MaxHP: 60,000

     

    Stalker Gertie:

    Skills available: Chasewalk, Hiding, Backstab, Close Confine, Preserve, and Plagiarism

    MaxHP: 90,000

     

    Creator Flamel:

    Skills available: Cannibalize, Create Marine Sphere, Demonstration, Acid Terror, Potion Pitcher

    MaxHP: 80,000

     

    Mastersmith Haward:

    Skills available: Weapon Perfection, Cart Boost, Maximum Thrust, Hammerfall, Cart Termination

    MaxHP: 140,000

     

    Sniper Cecil:

    Skills available: Sharp Shooting, Concentration, Arrow Shower, Freezing Trap, Land Mine

    MaxHP: 70,000

     

    Clown Alphoccio/Gypsy Trentieni:

     

    Skills available: Arrow Vulcan, Concentration, Tarot Card of Fate, Scream/Frost Joker, A Poem of Bragi

    MaxHP: 80,000

     

    Gameplay Video:

    note: this video is dated now and does not include all the 13 characters:

     

    What do you guys think of this approach to pvp? is there a pvp mode you'd like to see in RO? please reply with your thoughts, Cheers.

    • Upvote 1
    • Love 4
  17. WoE rewards depending on time spent in castle


    This script rewards players for each minute spent on WoE castle.

    Features:

    • Can reward players for every minute they spend inside a WoE castle
    • Can reward players for every kill in WoE castle, and will also display the name of the killed/killer.
    • Excludes AFK players and players who are not in a guild.
    • Announces kills with different colors depending on the killer's castle
    • Can set a modifier for certain classes to gain more points than others

    Settings:

    setarray .maps$ ,"schg_cas03", "prtg_cas01"; //maps where the system is active
    .points_per_minute = 1; //number of points earned for each minute you spend in the castle
    for (.@i = 0 ; .@i < getarraysize(.maps$) ; .@i++)
        if (!getmapflag(.maps$[.@i],mf_loadevent)) setmapflag .maps$[.@i],mf_loadevent;
    
    .s_idle_time = 180; // time before player is considered idle (in seconds)
    .rewardId = 909;    // ID of the reward item
    .announce = 0;  // Announce kills (0 = no announcement, 1 = map announcement, 2 = global announcement)
    .color_defenders$ = "0xffff00"; // Announcement color when a defending player kills an attacking player
    .color_attackers$ = "0x99ccff"; // Announcement color when an attacking player kills a member of the castle's owner
    .kill_reward = 1;   // Amount of points earned for every kill, set to 0 to disable it
    setarray .class_modifier[0],4063,3,4076,2;  // Modifier for certain classes [Id, Modifier, Id, Modifier....]

    This script is a part of a larger rewards script that includes a WoE ranking,  emperium breaking rewards, and rewards depending on the damage dealt during WoE. I might release the entire script in the future.


     

  18. On 2/5/2021 at 3:37 AM, Ryonin said:

    Does rAthena have a source release with skills modifications based on Ragnarok Zero & iRO Transcendent?

    If you mean the massive 1st and 2nd job update mentioned here, then yes, it's all implemented in rAthetna afaik.

    just make sure you have the latest version of rAthena.

×
×
  • Create New...