Jump to content

GmOcean

Members
  • Posts

    666
  • Joined

  • Last visited

  • Days Won

    4

Posts posted by GmOcean

  1. Okay, I updated the script in my original post. Should fix the name display, as well as reduced zeny from 1m to 10k.

     

    As for why you said, P3 killed P2 instead of P1, I have no idea. The script should run only when a player is killed by another player.

    Then 2 variables are set, killerrid (Person who killed someone), and killedrid (Person who died). The script then converts these 2 variables into the player's names and runs the announcement as such.

     

    So if your seeing P3 instead of P1, then I can only assume P3 indeed did kill P2.

  2. @Cydh - Is that a problem that persists even when using @warp command via script as well? Because players should be able to warp them selves across Map-Servers via @commands and legit portals.

     

    As for the @who<1/2/3> & guild recall, this is a problem resulting from 2 different map-servers (2 different worlds essentially). So normally the command runs a query on the map-server and it does it's thing, but what if we were to store the information it's looking for in a seperate sql table? One that would just store Map names the player is on, if they are a GM, and their levels and stuff (think thats what @who2 does). Then since both map-servers will update that same sql table, if we alter the command to use that table, it theoretically should send the correct information.

     

    Granted, we would have to add this as something that happens with every map change, a permanent hidden load_map mapflag of sorts.

  3. There isn't really a GOOD reason to allow this, but you have to look at it from the player's aspect. As of right now, over 90% of the RO servers, give V4P (Vote for Points), which of course is encouraged by server admins, because they want that little boost above others as far as advertisement goes.

    However, if you look at it from the players point of view, you're left with the question of why should I vote? Most player's will more than likely not vote, because it's a hassle, they feel like it's not needed for the server to grow, they would rather just come home from work/school and just play games to relax and have fun. Even those who have an abundance of free time, would rather spend that time playing RO than voting for it.

     

    So owners are left with only 1 option, give them an incentive to vote. Because from the Owner's point of view, he needs his player's votes for advertisement, whether it be 100% true or slightly watered down due to a small bribe (points). However that's just 1 issue Owners have to deal with, and the next one is probably the biggest as far as voting sites go.

     

    Let's say, that the average votes a server gets with a V4P system, is 85% of their population. Out of 1,000 players (actively playing not AFK merchants), thats 850 votes. Now a server with only half that amount of players, get's only 425 votes.

    From here we can see that the lower the population the lower the votes, but also since voters get rewarded, the votes are consistent. Meaning, ServerA with 850 votes, will always have more than ServerB with 425.

     

    But when we remove the incentive to vote, your left with a completely random % of voting, based on nothing but the human element of WHY? As in WHY should I vote, what do I get from it immediately? Obviously when this happens you run into the final problem, of people looking for a server to join.

    9/10 times, when a player is looking for a server they view the # of votes, as an equivalent to the # of players. Atleast a benchmark for what they can expect. Because of this they are way more likely to check out those servers out.

    Now, you may be asking why does this matter, well that's because, MOST servers' who do have votes, those votes are rewarded from the following players:

    1. Players looking to get the points to obtain whatever it is they want ingame from those points. ( Most commonly those players are people who have just recently joined ).

    2. Players who have just joined the server, because they really like it and want more people to play.

    3. Players who have been on the server long enough to know it's really good and they feel they should vote. ( Most commonly, these type of voters only exist for servers that have been around for atleast 6months, higher results are yeilded to those who have been their longer ).

     

    Basically, More People, more Votes. More Votes, more people.

    Without the incentive to vote, you have only 1 type of voter, those who are faithful to their server, that choose to spend their time playing that particular server.

    From my opinion that means, the larger servers, will continue to increase the gap between them and smaller servers almost exponetially. Because, the human element of " WHY? " still applies. A player on a server that has been around for awhile, is FAR FAR FAR more likely to vote, then a player who REALLY likes their server, but that same server has only been out for a couple months. Why? Because again, players who have just recently joined a server would rather spend their time playing, to get better gear, and hopefully catch up to those who have been there for awhile.

     

    But this can all be viewed from both sides equally as well.

    So like I said in the begining, there really isn't a GOOD reason to allow this feature, but if there was ever a reason too, I listed and attempted to explain the best I could, why it should be allowed, however I do realise you can take the same points, and make an equally good argument as why it shouldn't be allowed.

     

    So perhaps, after you look at the information I provided, you can come to a decision, of whether or not YOU feel like it should or shouldn't be added, and if your not completely sure, you can always put up a ' POLL ' to see what your potential userbase would want.

  4. What your asking to do is change a " BATTLE " flag, not a mapflag. Therefore your process wont work. Also, changing a battle effect, works cross-server not on a map-by-map basis.

     

    In order to properly do this, you just have to give the player extra exp per kill, using a script that does it for you.

  5. You need to edit the script data for each card you want to change.

    For example, you have a hydra card which gives +20% (?) to Demi-humans. Now if you use 4 of them, thats basically 4x 20% dmg (granted RO calculates this with a diminishing effect, 20-20-15-10). In order to make it so only 1 works, you need to run an IF statement to see if another of this card is equipped.

     

    Example:

    if( countitem( hydra_card ) >1 ){end;} else { +20% Demi-human dmg}.

     

    Now obviously the above isn't EXACTLY how to do this, but it's the basic concept.

  6. As he said before, @kick will make the player close the client. This has to do with, the new login window issue. Where kicking them acts like a kill-client. Same with d/cing on new login windows because it is all apart of their new hack/loss prevention system where, they want you to re-log every time so that you aren't stealing peoples stuff.

     

    Dont' ask me why, it's just the way they chose to handle this.

     

    Edit:  Also, i'm not sure how the ban script would be written, since I don't know how the script acts, and I also don't remember how the ban command works lol. And by that I mean, the syntax. Cuz I think you needed to specify s/mn/h/d//m/y (seconds,mins,hours,days,months,years).

  7. If this IS possible, then at the very least it would require packet sniffing to find out exactly which packet is sent when they do go to character select screen. And then from there, we need to send that specific packet to that person only. Again, would require src edits. Not sure if this is even practical. You could do an @ban 1second and then it should send them to login screen, where they can just login again since that 1second is sure to be up.

  8. Yes and No.

    yes it can be done using the following:

    *getnameditem <item id>,<character name|character ID>;
    *getnameditem "<item name>",<character name|character ID>;
    
    Create an item signed with the given character's name.
    
    The command returns 1 when the item is created successfully, or 0 if it fails.
    Failure occurs when:
    - There is no player attached.
    - Item name or ID is not valid.
    - The given character ID/name is offline.
    

    However, again No, because then if the name your using isn't a Player ( or Player online ), then it will fail.

    This is why, a Psuedo character is needed, to complete this task.

     

    Also the reason getcharid(2) doesn't work, is because I believe it stores the ID the same as it does parties.

    Meaning Getcharid(2) would only present you with 001,002,003 etc etc.....

     

    Where as getcharid(0) is an 11(?) digit number, allowing for the name processing to take place.

  9. Yeah, but doing that wouldn't make it an official Emperium. Just a regular monster that looks like emperium.

    You need to edit on the src side, so that it acts like an emperium (immune to certain skills, etc...)

  10. Okay, again, I wasn't 100% sure it would even work. From what I can tell, there are some syntax errors, in the guide I gave you. I, for the life of me, can't find them lol. So I suggest taking this to source requests/support to see if someone more skilled and knowledge able from me can help you with that, since again, it was just a; "here, hope this works out for you." Attempt.

     

    Again, sorry and good luck! :D

     

    Edit: I did find one error though.

        if(md && md->guardian_data) {
    if(class_ == MOBID_EMPERIUM && flag&BF_SKILL && !(skill_get_inf3(skill_id)&INF3_HIT_EMP)) //Skill immunity.
    return false;
    

    seems an extra copy of this was added to my: Change To   post. That would cause some errors of duplicate entrys.

    Though, that's all I could gather from this, I have some ideas but i'd rather not say them and send you on a wild goose chase lol. So let's leave this up to the far more experienced src mods on rA.

    • Upvote 1
  11. This would require a src edit. Not too big of one, but enough really.

     

    * NOTE - ALWAYS BACK UP YOUR SRC FILES BEFORE MAKING CHANGES *

    Find this in: src/map.h

    enum MOBID {
    MOBID_PORING	= 1002,
    MOBID_RED_PLANT	= 1078,
    MOBID_BLACK_MUSHROOM	= 1084,
    MOBID_GOBLIN_1	= 1122,
    MOBID_GOBLIN_2,
    MOBID_GOBLIN_3,
    MOBID_GOBLIN_4,
    MOBID_GOBLIN_5,
    MOBID_MARINE_SPHERE	= 1142,
    MOBID_A_GUARDIAN	= 1285,
    MOBID_K_GUARDIAN,
    MOBID_S_GUARDIAN,
    MOBID_EMPERIUM,
    MOBID_TREAS01	= 1324,
    MOBID_TREAS40	= 1363,
    MOBID_G_PARASITE	= 1555,
    MOBID_G_FLORA	= 1575,
    MOBID_G_HYDRA	= 1579,
    MOBID_G_MANDRAGORA	= 1589,
    MOBID_G_GEOGRAPHER	= 1590,
    MOBID_S_GUARDIAN_	= 1899,
    MOBID_A_GUARDIAN_,
    MOBID_BARRICADE1	= 1905,
    MOBID_BARRICADE2,
    MOBID_GUARIDAN_STONE1,
    MOBID_GUARIDAN_STONE2,
    MOBID_FOOD_STOR,
    MOBID_BLUE_CRYST	= 1914,
    MOBID_PINK_CRYST,
    MOBID_TREAS41	= 1938,
    MOBID_TREAS49	= 1946,
    MOBID_TATACHO	= 1986,
    MOBID_CENTIPEDE,
    MOBID_NEPENTHES,
    MOBID_HILLSRION,
    MOBID_HARDROCK_MOMMOTH,
    MOBID_TENDRILRION,
    MOBID_CORNUS,
    MOBID_NAGA,
    MOBID_LUCIOLA_VESPA,
    MOBID_PINGUICULA,
    MOBID_G_TATACHO	= 1997,
    MOBID_G_HILLSRION,
    MOBID_CENTIPEDE_LARVA,
    MOBID_SILVERSNIPER	= 2042,
    MOBID_MAGICDECOY_FIRE,
    MOBID_MAGICDECOY_WATER,
    MOBID_MAGICDECOY_EARTH,
    MOBID_MAGICDECOY_WIND,
    MOBID_ZANZOU	= 2308,
    MOBID_S_HORNET	= 2158,
    MOBID_S_GIANT_HORNET,
    MOBID_S_LUCIOLA_VESPA,
    };
    

    Add after MOBID_S_LUCIOLA_VESPA,

    MOBID_ZANZOU    = 2308,
    MOBID_S_HORNET    = 2158,
    MOBID_S_GIANT_HORNET,
    MOBID_S_LUCIOLA_VESPA,
    MOBID_EMPERIUM_2    = XXXX, //xxxx = ID of new emperium created.
    };
    

    Should look like above when finished.

     

    Find in: src/mob.c

    	if (mob_id == MOBID_EMPERIUM)
    {
    struct guild_castle* gc = guild_mapindex2gc(map[m].index);
    struct guild* g = (gc) ? guild_search(gc->guild_id) : NULL;
    if (gc)
    {
    

    And change to:

    	if (mob_id == MOBID_EMPERIUM || mob_id == MOBID_EMPERIUM_2)
    {
    struct guild_castle* gc = guild_mapindex2gc(map[m].index);
    struct guild* g = (gc) ? guild_search(gc->guild_id) : NULL;
    if (gc)
    {
    

    Find in: src/mob.h

    #define mob_is_gvg(md) (map[(md)->bl.m].flag.gvg_castle && ( (md)->mob_id == MOBID_EMPERIUM || (md)->mob_id == MOBID_BARRICADE1 || (md)->mob_id == MOBID_GUARIDAN_STONE1 || (md)->mob_id == MOBID_GUARIDAN_STONE2) )
    

    Change to:

    #define mob_is_gvg(md) (map[(md)->bl.m].flag.gvg_castle && ( (md)->mob_id == MOBID_EMPERIUM || (md)->mob_id == MOBID_EMPERIUM_2 || (md)->mob_id == MOBID_BARRICADE1 || (md)->mob_id == MOBID_GUARIDAN_STONE1 || (md)->mob_id == MOBID_GUARIDAN_STONE2) )
    

    That takes care of the easy parts... Now the more time consuming ones.

     

    Everything else, listed will be found in src/map/battle.c until otherwise specified.

    Find in: src/battle.c

    	if(md && md->guardian_data) {
    if(class_ == MOBID_EMPERIUM && flag&BF_SKILL && !(skill_get_inf3(skill_id)&INF3_HIT_EMP)) //Skill immunity.
    return false;
    
    if(src->type != BL_MOB) {
    struct guild *g = src->type == BL_PC ? ((TBL_PC *)src)->guild : guild_search(status_get_guild_id(src));
    if (class_ == MOBID_EMPERIUM && (!g || guild_checkskill(g,GD_APPROVAL) <= 0 ))
    return false;
    

    Change To: (Should make your new emperium immune to certain skills like original emperium).

    	if(md && md->guardian_data) {
    if(class_ == MOBID_EMPERIUM && flag&BF_SKILL && !(skill_get_inf3(skill_id)&INF3_HIT_EMP) || class_ == MOBID_EMPERIUM_2 && flag&BF_SKILL && !(skill_get_inf3(skill_id)&INF3_HIT_EMP)) //Skill immunity.
    return false;
    
    if(src->type != BL_MOB) {
    struct guild *g = src->type == BL_PC ? ((TBL_PC *)src)->guild : guild_search(status_get_guild_id(src));
    if (class_ == MOBID_EMPERIUM && (!g || guild_checkskill(g,GD_APPROVAL) <= 0 ) || class_ == MOBID_EMPERIUM_2 && (!g || guild_checkskill(g,GD_APPROVAL) <= 0 ))
    return false;
    

    Find:

    if( attack_hits && class_ == MOBID_EMPERIUM ) {
    

    Change To:

    if( attack_hits && class_ == MOBID_EMPERIUM || attack_hits && class_ == MOBID_EMPERIUM_2 ) {
    

    Find:

    	if( bl->type == BL_MOB && ((TBL_MOB*)bl)->mob_id == MOBID_EMPERIUM )
    return 0;
    

    Change To:

    	if( bl->type == BL_MOB && ((TBL_MOB*)bl)->mob_id == MOBID_EMPERIUM || bl->type == BL_MOB && ((TBL_MOB*)bl)->mob_id == MOBID_EMPERIUM_2 )
    return 0;
    

    Find:

    	case BL_MER:
    if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM && flag&BCT_ENEMY)
    return 0; //mercenary may not attack Emperium
    

    Change To:

    	case BL_MER:
    if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM && flag&BCT_ENEMY || t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM_2 && flag&BCT_ENEMY )
    return 0; //mercenary may not attack Emperium
    

    Find:

    	if( map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM )
    return 0; //If you don't belong to a guild, can't target emperium.
    

    Change To:

    	if( map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM || map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->mob_id == MOBID_EMPERIUM_2 )
    return 0; //If you don't belong to a guild, can't target emperium.
    

    That should be everything on the src side. Now you just need to create a new monster, and give it the ID you listed in the begining of this guide.

    IF everything finishes without any errors, then you should have effectively duplicated the emperium by giving it a new ID.

     

    There might be better/simpler ways to do this, but this is what I can think of.

    • Upvote 1
  12. There are 3 possible solutions:

    1. Update your rAthena server, so that there aren't any PCRE problems.

    2. Enter a SPACE before the answer. (eg. " Poring"  instead of "Poring". You'll notice a space in the first example.)

    3. Change the langtype of your server from 0 to 1. ( or 1 to 0 depending on what it currently is ).

     

    *Note - if none of the above solutions work, then assume that your server doesn't have PCRE support. It is needed to understand PERL expressions. Additional steps may need to be taken to get it installed, if using an OS other than Windows (such as Linux or Mac ).

  13. Couldn't you just setoption Option_Invisible | Option_Xmas to 0 upon warping them out, since it just nullifies those 2 particular effects. And if they were 0 already ( Candidates ) it wouldn't change anything, this would eliminate the need to "force" them to logout, but you could also add the logout as a fail-safe, since scripts like these are easily abused. But, to fully prevent it from being abused, you'd need a bit more complicated If(then)statement, because you can just summon the person with GuildRecall, and then they are invisible forever provided they don't re-enter and logout.

  14. I've made a couple instances from PM requests, but that was using the old system. Supposedly the new system is easier to use and simplifies alot of things, but I haven't messed with it much, I went as far as to create a map, spawn 1 mob and kill it to get warped out lol xD.

     

    Also, 90vs40% I figured 90% of the script was spawning the monsters haha xD

    • Upvote 1
  15. Sounds like a good idea, it's a fairly easy script to make since 90% has been finished with the instance script, the only difficult task now is sifting through everything, and replacing the instance related stuff and converting it into an NPC controlled code, since we aren't using the instance engine so to speak. Sadly, I won't be taking this up since, I hate the way instance dungeons are scripted lol, makes it a pain to find stuffs :/

  16. @Unknown - While it does sound fun to both make and to play, the Kill/Death Ratio will be annoying to work with since, rA doesn't store anything in decimal form. At the most we might just have to compare who has the highest kills, and least deaths, and if the NEXT person reaches that amount of kills, while having the same or less deaths, change them. Kinda sucks, cuz we can't just do the calculations and use a decimal number... oh wellz, we can still make it work though.

  17. *swt* and here i thought I could retire T.T; lol... no.6 xD

    Well, gonna have to do it tomorrow after work I guess. Who ever feels up to the task please go right ahead and do it to help this person out. Annie has done about 90% of the script, just refer to that when you go to make your version (should you choose to try) it should prove to be most helpful for those wondering how to start this.

  18. Lol, this sounds alot like my juggernaught event script I wrote, with the exception of it being an event, thus making it tremendously easier, since you won't have to keep track of each player in the event, instead just 2-3 variables containing who is a Beserked Godlike, Berserked (not-godlike) and lastly how long has each been as such.

     

    Edit: oops, seems i'm REAALLY late on this one lol, Annie has already taken it up =P

  19. You must have accidentally put a different number other than 10, when specifying it's max level. It won't stop at 10 just because it's in the skill tree of another class. You need to specify the max level as well. So look back in your db file, and double check, because it is possible to change the limits based on the class of your choice, for instance making it so Knight gets to use it at only level 5. And swordsman at level 1.

×
×
  • Create New...