Leaderboard
Popular Content
Showing content with the highest reputation on 01/24/13 in Posts
-
Concuerdo con lo que señala Leeg, y la organización que sugiere Brainstorming. Hay que hacer las cosas bien y no ir tan apresurados. Lo bueno es que el trabajo que ya se hizo siempre se puede tomar como base y corregirse... pero antes de seguir a mas, hay que detenerse y dar el tiempo de darle énfasis a la organización que han sugerido. De lo contrario se van a ahogar de trabajo que hay que corregir. Hay que darle formalismo y calidad al proyecto. No trata de traducir solo porque si, hay que recordar que se pretende que sea una alternativa fidedigna, estable, actualizada y bien hecha de una traducción del emulador actual... que pretende llegar al uso de grandes masas. En ingles todo va pulcro, en español debe de ir también así. Sobre ayudar, yo lastimosamente no puedo. No es mi ámbito y bueno, estoy hasta la cabeza con el proyecto sobre granny 2 que participo ahorita.2 points
-
DE's HEARTRINGS SYSTEM This may sound crazy, but I also believe it's a good idea, why not? In order to get some advertising (since it's really needed), I'm implementing a points system that people can exchange for gifts or some love. These services aren't mean to boost your server graphics development or something, these are just lovely gifts from me. Ok, so let's go, I'll list what stuff gives points: Posting a lovely (it must be lovely, if not it doesn't count lol) message there: +1 Heartring Using DE's userbar linking to this thread (each RO-related forum counts): +5 Heartrings Link from your RO website/forum (each site/forum counts, not userbar): +10 Heartrings Purchasing something from me (over 25$): +10 Heartrings Use more than 5 of my custom sprites in your server: +10 Heartrings Use more than 15 of my custom sprites in your server: +15 Heartrings Translating one of my guides from Spanish to English: +15 Heartrings Sending me a customer (over 50$): +20 Heartrings Working with me in a collaboration project/server: +20 Heartrings Advertise my services in your main page: +20 Heartrings Being a lovely person: +50 Heartrings Acting not according to my ToS: +1000 Baphorings and u lose all your stacked love. Gifts/prizes: 10 Heartrings for 5% discount. 20 Heartrings for 10% discount. 20 Heartrings for an inventory sprite gift. 30 Heartrings for a 20 dyes pack. 40 Heartrings to advertise your server in my signature for 1 month. 50 Heartrings to make a beautiful headgear for you. 60 Heartrings to make an NPC based on you and with your name on it. 80 Heartrings to make a small map to commemorate our love <3. 100 Heartrings and you will get a lovely prize . *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* If you liked my work, dont forget to use the DE's Userbar =D I think it's good to show my work in order to encourage other people to start spriting/pixel art. Well, basically, my RO-related works are organized in generations/collections. My portfolio is made up of: 1st Sprite Generation (a.k.a. The Red Moon Collection): My first sprites and palettes, Jan 07 ~ Jun 07. Approximately made up of 30 works. 2nd Sprite Generation (a.k.a. The Silver Moon Collection): Medium knowledge as a spriter. Not private spriter anymore (Not working for p.servers). Jun 07 ~ Jul 08. Around 25 designs or more. 3rd Sprite Generation (a.k.a. The Golden Moon Collection): High Knowledge in RO Graphics. 4th Sprite Generation (a.k.a. The Light Moon Collection): 2010-2011 (last works as a RO artist before retirement) .A. Hearts (.Atska.'s Collection): Dedicated to Atska. Fashion and girlish customs. 1st Mapping Generation: When I got Borf's. 2nd Mapping Generation When I improved at Borf's My current works aren't included in any generation/collection anymore. Download packs: First Sprite Generation: Headgears - Mobs Second Sprite Generation: All material (Except private or/and unfinished works) Third Sprite Generation: Mobs UPDATE: My sprites are no longer available for free. Please contact me to purchase them through email or twitter. Thanks to Luigiman for hosting the material - Give credits in your website or forum. - You are not allowed to redistribute or share them unless I gave permission to do so. Redistribution of my public work is allowed in brAthena, frAthena, DivineRO and rAthena. - Do not steal credits from the original author/s. - It is prohibited to use these works to make money unless I gave you permission to do so. - You are not allowed to edit my material without permission. Many of these works are based on official Gravity's designs, so I'm not the only author of these designs (there are, however, a lot of 100% original designs). Keep that in mind if you are planning to give credits to me only. Same happens with Trickster Edits. I wrote in descriptions which sprites are Trickster conversions or edits. If you want to use them as donations, please ask me through PM and then I may give you the permission. DevilEvil's Portfolio Fourth Sprite Generation To conmemorate Gay Pride Festival /me likes EVE Based on people: Jman, Usako, Rico, Eury, Epoque, me, and a friend, Phoebe xD. Third Sprite Generation Based on an Arcturus NPC A project never finished for Kisuka . Made it for the Gay Pride Festival (Reference from Arcturus) Original designs by DevilEvil are published under the Creative Commons non-commercial license. Second Sprite Generation (Forum doesnt let me upload more images) Original designs by DevilEvil are published under the Creative Commons non-commercial license.1 point
-
File Name: [Mapflag] Mobitemadder File Submitter: Zephyr File Submitted: 28 Dec 2012 File Category: Source Modifications Content Author: Zephyr This mapflag sets more drops for monsters at the map that it's been attached. Sintax: mapname<TAB>mapflag<TAB>mobitemadder<TAB>mob_id,item_id,drop_per{,item_id,drop_per(...)} You can set up to ~50 more items for mobs. "drop_per" is the chance of drop, from 1 (0,01%) to 10000 (100%). There's an example at the screenshot, I setted a Yggdrasil Berry with 100% of chance for the Poring at prt_fild08 map. You can set a lot of mobs, but you have to set more mapflags for your maps. Click here to download this file1 point
-
Disable skill or item usage in certain maps. Add a new txt in your db folder.. item_mapdeny.txt //<nameid>:<map1>{,<map2>,<map3>,<map4>,...} //Disables Red Potion usage in Prontera and Payon 501:prontera,payon skill_mapdeny.txt //<skillid>:<map1>{,<map2>,<map3>,<map4>,...} //Disables skill TF_HIDING usage in Prontera and Lighthalzen 51:morocc,lighthalzen That's it, nothing much to say. skill_and_item_mapdeny(rAthena17100).diff skill_and_item_mapdeny(rAthena17100)_v2.diff - Supports multiple maps per line skill_and_item_mapdeny(rAthena171278).diff Please click the button if I have helped you. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1 point
-
Is this possible to add this? First release was on 12/14/2011 on kro sakray and 01/04/2012 on kro main server. Implemented Battleground Queue System. Players can click on "Battle" button under basic info window and choose desired battleground to queue. Players can use the Queue System from anywhere. Players can enter the battleground, when there are enough players to start a battleground, by clicking on confirmation button. If players leave the Queue System, they will be unable to enter the Queue System again for 1 minute. Players will return to their original position after the end of Battleground if they were in normal field, town or dungeon maps. If players were previously in special dungeon or field maps, they will be returned to the save point.1 point
-
Hello there, It's been a long time since the last time I posted something here. (to the point) Here, I have repacked an updated Miruku Client, dated on 9th of January, 2013. Client was updated through normal patches, repacked using WinRAR (sorry, I still haven't learnt NSIS since the last time (http://rathena.org/board/topic/70753-miruku-07-09-2012-7th-september-2012/'>Miruku 07-09-2012 (7th September 2012)) I updated. Parts are uploaded to Mediafire. Enjoy and have a nice day~ http://www.mediafire.com/?8owj579z85ncb'>Miruku 09-01-2013 *PS: please let me know if something happens. If there is (are) missing files / problems / etc, please don't forget to PM me. Sorry, the files on my Mediafire have been deleted~ UPDATE: As I heard so much problems encountered when downloading the file (yes, I admit it is all because of my account), I have made a mirror from filecloud.io with the links below: http://filecloud.io/k2mwt8ra'>BGM http://filecloud.io/j1g6adbw'>Part 1 http://filecloud.io/djntzwpa'>Part 2 http://filecloud.io/n6chkj78'>Part 3 http://filecloud.io/5akyl0jc'>Part 4 http://filecloud.io/bdf4t8ep'>Part 5 http://filecloud.io/s82eo4fm'>Part 6 http://filecloud.io/h0xmbu71'>Part 7 http://filecloud.io/prwqiaxd'>Part 8 http://filecloud.io/hidfu2wz'>Part 9 http://filecloud.io/yu4r2qf6'>Part 10 http://filecloud.io/2y86nvum'>Part 11 UPDATE 2: Instead of sharing these files like that, I am giving you the credentials of my Mediafire. Well, I ask for all of you to be nice to all other as well as me. Not much, I am just asking you NOT to delete / damage the any of the files inside the account, as well changing the password. So, here it is: Mediafire e-mail: [email protected] password: freeforfriends Have a nice day! UPDATE 3: Now available on GDrive! https://docs.google.com/folder/d/0B4GIW--OnyUETlNPcEZhdEU0YkE/edit?usp=sharing'>https://docs.google....dit?usp=sharing Have a nice day! UPDATE 4: A mirror has been added, http://star-o.net/miruku/'>http://star-o.net/miruku/(Thank to Snow) !!! Re-hosting and re-mirrorring is NOT allowed without permission from the owner of the file !!!1 point
-
Search and replace if (getgmlevel()>=$@GMLevel){goto GM_Player;} by if (getgmlevel()>=$@GMLevel || getgroupid() == 2 || getgroupid() == 5) goto GM_Player; and menu "Turn ^FF0000ON^000000 / ^0000FFOFF^000000 Event",iEvent,"Event Settings",iSettings; by menu "Turn ^FF0000ON^000000 / ^0000FFOFF^000000 Event",iEvent, ( ( getgmlevel() == 99 || getgroupid() == 5 ) ? "Event Settings" : "" ),iSettings;1 point
-
Try this one. jupe_ele,36,53,6 script Event Invasion 105,{ setarray .@mp$[1], "prontera", "morocc", "geffen", "payon", "alberta", "izlude", "aldebaran", "xmas (lutie)", "comodo", "yuno", "amatsu", "gonryun", "umbala", "niflheim", "louyang", "jawaii", "ayothaya", "einbroch", "hugel", "rachel", "veins", "moscovia", "midgard camp", "manuk", "splendide", "brasilis", "el dicastes", "mora", "dewata", "malangdo island", "malaya port", "eclage"; setarray .mapflag_event, mf_nopvp, mf_nomobloot, mf_nobranch; // GM menu //It allows GMs Level 50 or more to Start and Stop invasions. if( getgmlevel() > .gm ) { if( .count ) { mes "[Event Invasion]"; mes "An invasion is in progress.."; mes "Location: " + .map_event$; mes "^FF0000"+.count+"^000000 Monsters left"; mes " "; mes "Stop invasion?"; if( select("No:Yes") ) close; donpcevent "Event Invasion::onstop"; mes "Invasion stopped"; announce "The Invasion has been stopped by "+strcharinfo(0),bc_all; close; } mes "[Event Invasion]"; mes "Please customize the Invasion event before starting it."; Main: next; mes "[Event Invasion]"; mes "MVP Item Drop:[^FF0000" + getitemname(.Item_ID) + "^000000]"; mes "Monsters Respawn:[^FF0000" + strmobinfo(1,.mob_ID) + "^000000]"; mes "Reward 1 place: [^FF0000" + getitemname(.gained[ 0 ]) + "^000000]"; mes "Reward 2 place: [^FF0000" + getitemname(.gained[ 1 ]) + "^000000]"; mes "Reward 3 place: [^FF0000" + getitemname(.gained[ 2 ]) + "^000000]"; mes "MVP Respawn:[^FF0000" + strmobinfo(1,.Mvp_ID) + "^000000]"; mes "Map Event will Start:[^FF0000"+.map_event$+"^000000]"; switch(select("Item [" + getitemname(.Item_ID) + "]", "Monster [" + strmobinfo(1,.mob_ID) + "]", "Reward for the first place [" + getitemname(.gained[ 0 ]) + "]", "Reward for the second place [" + getitemname(.gained[ 1 ]) + "]", "Reward for the third place [" + getitemname(.gained[ 2 ]) + "]", "MVP [" + strmobinfo(1,.Mvp_ID) + "]", "Select Map Event["+.map_event$+"]:Start Event")) { case 1: next; mes "[Event Invasion]"; mes "Which item would you like the MVP to drop?"; mes "Please input the item ID:"; input .Item_ID; if( getiteminfo( .Item_ID, 0 ) == -1 ) { .Item_ID = 0; mes "Unknown ID."; } goto Main; case 2: next; mes "[Event Invasion]"; mes "Please input the monster ID:"; input .mob_ID; if( strmobinfo( 1, .mob_ID ) == "" ) { .mob_ID = 0; mes "Unknown ID."; } goto Main; case 3: next; mes "[Event Invasion]"; mes "Please input the first place will drop:";// ( here i will put id reward for the first place) input .gained[ 0 ]; if( getiteminfo( .gained[ 0 ], 0 ) == -1 ) { .gained[ 0 ] = 0; mes "Unknown ID."; } goto Main; case 4: next; mes "[Event Invasion]"; mes "Please input the second place will drop:";// ( here i will put id reward for the second place) input .gained[ 1 ]; if( getiteminfo( .gained[ 1 ], 0 ) == -1 ) { .gained[ 1 ] = 0; mes "Unknown ID."; } goto Main; case 5: next; mes "[Event Invasion]"; mes "Please input the third place will drop:";// ( here i will put id reward for the third place) input .gained[ 2 ]; if( getiteminfo( .gained[ 2 ], 0 ) == -1 ) { .gained[ 2 ] = 0; mes "Unknown ID."; } goto Main; case 6: next; mes "[Event Invasion]"; mes "Please input the MVP ID:"; input .Mvp_ID; if( strmobinfo( 1, .Mvp_ID ) == "" ) { .Mvp_ID = 0; mes "Unknown ID."; } goto Main; case 7: next; mes "[Event Invasion]"; for ( set .@i, 1; .@i < getarraysize(.@mp$); set .@i, .@i + 1 ) set .@menuE$, .@menuE$ + .@mp$[.@i] + ":"; set .map_event$, .@mp$[select( .@menuE$ )]; mes "Map Event : "+.map_event$; for( .@i = 0; .@i < getarraysize( .mapflag_event ); .@i++ ) setmapflag .map_event$, .mapflag_event[ .@i ]; goto Main; case 8: next; mes "[Event Invasion]"; if( !.Item_ID || !.mob_ID || !.Mvp_ID || .map_event$ == "" || !.gained[ 0 ] || !.gained[ 1 ] || !.gained[ 2 ] ) { mes "Miss some conditions."; goto Main; } mes "Starting the event now..."; close2; goto onstart; } } // If a player clicks the NPC, it displays: mes "[Event Invasion]"; mes .count+" monster have invaded "+.map_event$+"!"; close; ///////////////////////// //The actual NPC Script// ///////////////////////// //OnMinute50: // Change this to your liking ( automatic start ) onstart: if( .count ) end; set .count, .number_mob; sleep2 1000; announce "[ Rune-Midgard Guard ]: We have trouble here in the town " + .map_event$ + "!", bc_all; sleep2 5000; announce "[ Rune-Midgard Guard ]: Everyone, we need your help to get rid of these monsters!", bc_all; monster .map_event$,0,0,"--ja--",.mob_ID, .count, strnpcinfo(0)+"::OnMyMobDead"; initnpctimer; end; OnMyMobDead: //When a mob is killed .count--; for( .@i = 0; .@i < getarraysize( .Data ); .@i++ ) if( getcharid(3) == .Data[ .@i ] ) { .Rank[ .@i ]++; break; } if( .@i == getarraysize( .Data ) ) { .Data[ .@i ] = getcharid(3); .Rank[ .@i ]++; } if( !.count ) { announce "[ Rune-Midgard Guard ]: The MvP " + strmobinfo( 1,.Mvp_ID ) + " has spawned in " + .map_event$ + "!", bc_all; monster .map_event$,0,0,"--ja--",.Mvp_ID,1,"Event Invasion::OnSpecialMobDead"; for( .@j = .number_mob; .@j > 0; .@j-- ) for( .@i = 0; .@i < getarraysize( .Rank ); .@i++ ) if( .Rank[ .@i ] == .@j && isloggedin( .Data[ .@i ] ) ) { getitem .gained[ .@W ], 1, .Data[ .@i ]; .@W++; announce .@W +"°/ "+ rid2name( .Data[ .@i ] ) +" gained 1 "+ getitemname( .gained[ .@W-1 ] ),0; if( .@W == getarraysize( .gained ) ) goto OnInit; } goto OnInit; } else announce "["+.count+"/"+.number_mob+"] " + strmobinfo(1,.mob_ID) + " left.",bc_map; end; OnSpecialMobDead: announce strcharinfo(0)+" has fought off the Invasion and has been awarded a worthy prize!", bc_all; getitem .Item_ID, 1; //Change the [5] to the amount you wish to hand out. onstop: killmonster .map_event$,"Event Invasion::OnSpecialMobDead"; for( .@i = 0; .@i < getarraysize( .mapflag_event ); .@i++ ) removemapflag .map_event$, .mapflag_event[ .@i ]; OnTimer1805000: // 30 minutes later, kills all the mobs. killmonster .map_event$,"Event Invasion::OnMyMobDead"; set .count, 0; stopnpctimer; OnInit: deletearray .Data[ 0 ], getarraysize( .Data ); deletearray .Rank[ 0 ], getarraysize( .Rank ); //- Config //-- Number of mob spawn .number_mob = 250; //-- GM Level to access the GM Menu. set .gm, 50; end; }1 point
-
Hmm, that's not bad at all. I didn't really expect it to work so easy. Kinda strange that the default animation doesn't work, though. I wonder why Gravity decided to split up the animations into separate files in the first place... Maybe you can try to duplicate one of the guardian mobs by adding it as a custom monster to see if it's a problem with the RSM exporter? Otherwise some more client edits might be necessary, yeah. I'm not sure if the code I posted is responsible for only adding more animations to an existing loaded model, or if it's also responsible for loading the main models. If it's animation only we could perhaps just export the standing/default animation in the 3dmob_bone folder as well. For higher GR2 vertex count you can try to replace this: Find: 3D 10 27 00 00 (offset 0x3AE69) Replace: 3D 20 4E 00 00 That would increase the limit from 10,000 to 20,000. Keep in mind the check might be there for a reason. Testing a bit probably won't hurt though. Not sure about RSM vertex count. Do you know the limit? I can try to look into it later.1 point
-
False, even bRO started a Pre-Re server. Well, in my sicere opinion, which is the same of 90% of nowadays players I know (and I know a lot of...), Renewal wasn't a good idea. To be honest, players hate most of things that came with Renewal, even the 3rd Jobs. Everytime players of mine asked for 3rd classes, for example, everything I needed to say is: 'Go to another server, and try renewal mechanics.', and them, they goes, and came back in a week. You, people who works with Renewal have all my respect, but I work for years for players who will never like Renewal. I did edits, reworks, adaptations, all to new features can fits the Transclass playing way and it was important to them; You say that's important to clean pre-renewal to preserve and enhance rAthena to Emulation proposition. So, why should contribute to something that will not be useful for everyone who uses it now? So...1 point
-
Got it! Open the EXE in a hex editor (XVI32 is my favorite), find the hex sequence: 83 FE 09 0F 87 84 (offset 0x39749) 0x09 is the limit it compares against, so you just need to set it to a higher value, for instance 0x64 (100 in decimal). It's only one byte that's changed so I figured it'd be just as fast for you to do it yourself. If you can't figure it out I'll patch and upload for you. Edit: Also found out the client has a hard limit of 10,000 vertices per GR2 model. Might be good to know? I think we could set a higher value for that as well though.1 point
-
prontera,156,185,5 script kjdhfkdjsf 100,{ mes "wanna sign up"; if ( select( "yes", "no" ) == 2 ) close; else if ( .signup_count == 128 ) { mes "Sorry the whole queue is full"; close; } while ( .signup_aid[.@i] != getcharid(3) && .@i < .signup_count ) .@i++; if ( .@i < .signup_count ) { mes "you have already sign up in this event"; close; } .signup_aid[ .signup_count ] = getcharid(3); .signup_count++; mes "You are now signed to the BG event"; // .@i = 0; // DEBUG // while ( .signup_aid[.@i] ) { // .@signup_name$[.@i] = rid2name( .signup_aid[.@i] ); // .@i++; // } // mes "[Debug] Currently have "+ .signup_count +" sign-in and they are "+ implode( .@signup_name$, "," ); close2; L_start: if ( .signup_count < .min2start ) end; for ( .@i = 0; .@i < .signup_count; .@i++ ) { if ( attachrid( .signup_aid[.@i] ) ) { if ( getmapflag( strcharinfo(3), mf_nowarp ) ) { // player has went into another event deletearray .signup_aid[.@i], 1; .signup_count--; .@i--; } } else { deletearray .signup_aid[.@i], 1; .signup_count--; .@i--; } } if ( .start || .signup_count < .min2start ) end; for ( .@i = 0; .@i < .signup_count; .@i++ ) unitwarp .signup_aid[.@i], "guild_vs3", 50,50; deletearray .signup_aid, .min2start; .signup_count -= .min2start; end; OnInit: .min2start = 2; // how many players to start the event while (1) { if ( !( .start = getmapusers( "guild_vs3" ) > 0 ) ) goto L_start; sleep 5000; } end; // shouldn't reach } for battleground script, I don't think using while-loop is the correct way if you want to make battleground script without using waitingroom here's the source modification http://rathena.org/board/topic/72571-battleground-system-without-waitingroom/#entry146937 prontera,156,185,5 script kjdhfkdjsf 100,{ mes "wanna sign up"; if ( select( "yes", "no" ) == 2 ) close; else if ( .signup_count == 128 ) { mes "Sorry the whole queue is full"; close; } while ( .signup_aid[.@i] != getcharid(3) && .@i < .signup_count ) .@i++; if ( .@i < .signup_count ) { mes "you have already sign up in this event"; close; } .signup_aid[ .signup_count ] = getcharid(3); .signup_count++; mes "You are now signed to the BG event"; // .@i = 0; // DEBUG // while ( .signup_aid[.@i] ) { // .@signup_name$[.@i] = rid2name( .signup_aid[.@i] ); // .@i++; // } // mes "[Debug] Currently have "+ .signup_count +" sign-in and they are "+ implode( .@signup_name$, "," ); close2; L_start: if ( .signup_count < .min2start ) end; for ( .@i = 0; .@i < .signup_count; .@i++ ) { if ( attachrid( .signup_aid[.@i] ) ) { if ( getmapflag( strcharinfo(3), mf_nowarp ) ) { // player has went into another event deletearray .signup_aid[.@i], 1; .signup_count--; .@i--; } } else { deletearray .signup_aid[.@i], 1; .signup_count--; .@i--; } } if ( .start || .signup_count < .min2start ) end; announce "event started", 0; .start = 1; for ( .@i = 0; .@i < .signup_count; .@i++ ) setbgid ( .@i %2 )? .red : .blue, .signup_aid[.@i]; deletearray .signup_aid, .min2start; bg_warp .red, "guild_vs3", 13,50; bg_warp .blue, "guild_vs3", 86,50; bg_updatescore "guild_vs3", 0,0; sleep .eventlasting * 1000; if ( .start == 1 ) { if ( .score[1] == .score[2] ) mapannounce "guild_vs3", "Draw !", 0; else if ( .score[1] > .score[2] ) { mapannounce "guild_vs3", " Red side wins !", 0; callsub L_reward, .red; } else if ( .score[1] < .score[2] ) { mapannounce "guild_vs3", " Blue side wins !", 0; callsub L_reward, .blue; } } bg_warp .red, "prontera", 155,182; bg_warp .blue, "prontera", 158,182; bg_kickall .red; bg_kickall .blue; .start = .score[1] = .score[2] = 0; goto L_start; L_reward: getbgusers getarg(0); for ( .@i = 0; .@i < $@arenamembersnum; .@i++ ) getitem 501, 1, $@arenamembers[.@i]; // item reward return; Onredout: callsub L_out, 2; Onblueout: callsub L_out, 1; L_out: announce strcharinfo(0) +" is out from the match !", 1; bg_leave; warp "SavePoint", 0,0; .score[ getarg(0) ]++; bg_updatescore "guild_vs3", .score[1], .score[2]; if ( .score[ getarg(0) ] == .min2start /2 ) awake strnpcinfo(0); end; OnInit: .eventlasting = 30 * 60; // how long would the event last or it auto-reset. 30 *60 = 30 mins .min2start = 2; // minimum player to start .red = createbgid( "guild_vs3", 13,50, strnpcinfo(0)+"::Onredout", strnpcinfo(0)+"::Onredout" ); .blue = createbgid( "guild_vs3", 86,50, strnpcinfo(0)+"::Onblueout", strnpcinfo(0)+"::Onblueout" ); end; } btw I saw you make some post in plankt's queue system, which I think, its useless if you want to use other member's algorithm function, its better that you duplicate out their script and write them again with your own scripting style and I found using queue system is not really practical choice ... most people here prefer to not to use source modification ... dunno why1 point
-
Okay, the problem seems to be in the GR2 file itself, and not in the converter. As you can see, the original RO GR2 file holds several meshes, but just one model, while the other holds the same number of meshes and models. This means the game will read only the first model of the GR2 file, which, in this case, is just composed of the first mesh. I'm not quite sure how to solve this, but it's something that has to be fixed at export time (when you export using 3DS Max). EDIT: Found a solution, and I already told Olrox on Skype about it. Just group the meshes when exporting and they will be considered a single model by the granny exporter.1 point
-
if you still need the buttons, here are those I created myself! guild_helper.rar Now if you have found a place where I can download the original buttons, please send me a message, because I still can not translate the battle_field! remember: these are not official al translate myself! but I believe they are perfect!1 point
-
With this modification you will have a new chat, like @main for another purposes. In this example I use @trading as an example. 1 -> Open src/map/atcommand.c and find: if(sd->state.mainchat) clif_displaymessage(fd, msg_txt(384)); // Main chat currently enabled. Usage: @main <on|off>, @main <message>. else clif_displaymessage(fd, msg_txt(385)); // Main chat currently disabled. Usage: @main <on|off>, @main <message>. } return 0; } Add below it: /*=================================== * Trading chat chat [darkmeistersp] * Usage: @trading <on|off|message> *-----------------------------------*/ ACMD_FUNC(trading) { if( message[0] ) { if(strcmpi(message, "on") == 0) { if(!sd->state.tradingchat) { sd->state.tradingchat = 1; clif_displaymessage(fd, msg_txt(950)); // trading chat has been activated. } else { clif_displaymessage(fd, msg_txt(951)); // trading chat already activated. } } else if(strcmpi(message, "off") == 0) { if(sd->state.tradingchat) { sd->state.tradingchat = 0; clif_displaymessage(fd, msg_txt(952)); // trading chat has been disabled. } else { clif_displaymessage(fd, msg_txt(953)); // trading chat already disabled. } } else { if(!sd->state.tradingchat) { sd->state.tradingchat = 1; clif_displaymessage(fd, msg_txt(950)); // trading chat has been activated. } if (sd->sc.data[sC_NOCHAT] && sd->sc.data[sC_NOCHAT]->val1&MANNER_NOCHAT) { clif_displaymessage(fd, msg_txt(957)); return -1; } sprintf(atcmd_output, msg_txt(956), sd->status.name, message); // I use 0xFE000000 color for signalizing that this message is // trading chat message. 0xFE000000 is invalid color, same using // 0xFF000000 for simple (not colored) GM messages. [LuzZza] intif_broadcast2(atcmd_output, strlen(atcmd_output) + 1, 0xFE000000, 0, 0, 0, 0); } } else { if(sd->state.tradingchat) clif_displaymessage(fd, msg_txt(954)); // trading chat currently enabled. Usage: @trading <on|off>, @trading <message>. else clif_displaymessage(fd, msg_txt(955)); // trading chat currently disabled. Usage: @trading <on|off>, @trading <message>. } return 0; } Then you need to find this: { "font", 1,1, atcommand_font }, And add below it: { "trading", 1,1, atcommand_trading }, //[darkmeistersp] Save this file. 2-> Open src/map/clif.c and find: case CHAT_MAINCHAT: //[LuzZza] iter = mapit_getallusers(); while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) { if( tsd->state.mainchat && tsd->chatID == 0 && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) { // packet must exist for the client version WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); } } mapit_free(iter); break; Add below it: case CHAT_TRADINGCHAT: //[darkmeistersp] iter = mapit_getallusers(); while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) { if( tsd->state.tradingchat && tsd->chatID == 0 && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) { // packet must exist for the client version WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); } } mapit_free(iter); break; Now find this in the same file: WBUFW(buf,0)=0x8d; WBUFW(buf,2)=len+8; WBUFL(buf,4)=0; safestrncpy((char *) WBUFP(buf,8),message,len); clif_send(buf,WBUFW(buf,2),NULL,CHAT_MAINCHAT); } And add below it: /*========================================== * Send trading chat message [darkmeistersp] *------------------------------------------*/ void clif_TradingChatMessage(const char* message) { char buf[200]; int len; if(!message) return; len = strlen(message)+1; if (len+8 > sizeof(buf)) { ShowDebug("clif_TradingChatMessage: Received message too long (len %d): %sn", len, message); len = sizeof(buf)-8; } WBUFW(buf,0)=0x8d; WBUFW(buf,2)=len+8; WBUFL(buf,4)=0; strncpy((char *) WBUFP(buf,8),message,len); clif_send((unsigned char *) buf,WBUFW(buf,2),NULL,CHAT_TRADINGCHAT); } Now find the next code: // Chat logging type 'M' / Main Chat if( log_config.chat&1 || (log_config.chat&32 && !((agit_flag || agit2_flag) && log_config.chat&64)) ) log_chat("M", 0, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, message); return; } And add below it: // Trading chat [darkmeistersp] if(strcmpi(target, trading_chat_nick) == 0) { if(!sd->state.tradingchat) clif_displaymessage(fd, msg_txt(958)); // You should enable trading chat with "@trading on" command. else { char output[256]; snprintf(output, ARRAYLENGTH(output), msg_txt(956), sd->status.name, message); intif_broadcast2(output, strlen(output) + 1, 0xFE000000, 0, 0, 0, 0); } } Save this file. 3-> Open src/map/clif.h and find this: CHAT_MAINCHAT, // everyone on main chat Add below it: CHAT_TRADINGCHAT, //[darkmeistersp] In the same file find this line: void clif_MainChatMessage(const char* message); //luzza And add below it: void clif_TradingChatMessage(const char* message); //[darkmeistersp] Save this file. 4-> Open src/map/map.c and find this: char main_chat_nick[16] = "Main"; Add below this: char trading_chat_nick[16] = "Trading"; //[darkmeistersp] In the same file find: if(strcmpi(w1, "main_chat_nick")==0) safestrncpy(main_chat_nick, w2, sizeof(main_chat_nick)); And add below it: if(strcmpi(w1, "trading_chat_nick")==0) //[darkmeistersp] safestrncpy(trading_chat_nick, w2, sizeof(trading_chat_nick)); Save this file. 5 -> Now open src/map/map.h and find: extern char main_chat_nick[16]; Add below it: extern char trading_chat_nick[16]; //[darkmeistersp] Save this file 6 -> Open src/map/pc.h and find: unsigned int mainchat :1; //[LuzZza] And add below it: unsigned int tradingchat :1; //[darkmeistersp] Save this file. 7 -> Open src/char/char.c and find: // check for reserved names if( strcmpi(name, main_chat_nick) == 0 || strcmpi(name, wisp_server_name) == 0 ) return -1; // nick reserved for internal server messages Replace it with: // check for reserved names if( strcmpi(name, main_chat_nick) == 0 || strcmpi(name, wisp_server_name) == 0 || strcmpi(name, trading_chat_nick) == 0) //[darkmeistersp] return -1; // nick reserved for internal server messages Save this file. 8-> Open src/char/inter.c and find: char main_chat_nick[16] = "Main"; Add below it: char trading_chat_nick[16] = "Trading"; //[darkmeistersp] Now find this in the same file: } else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza] safestrncpy(main_chat_nick, w2, sizeof(main_chat_nick)); And add below it: } else if(strcmpi(w1, "trading_chat_nick")==0){ // trading chat nick [darkmeistersp] safestrncpy(trading_chat_nick, w2, sizeof(trading_chat_nick)); Save this file. 9-> Open src/char/inter.h and find: extern char main_chat_nick[16]; Add below it: extern char trading_chat_nick[16]; //[darkmeistersp] Save this file. 10-> Repeat the steps 7, 8 and 9 with the files char.c, inter.c and inter.h that are located in src/char_sql/ 11-> Open conf/msg_athena.conf and add at the end of the file: 950: Trading chat has been activated. 951: Trading chat already activated. 952: Trading chat has been disabled. 953: Trading chat already disabled. 954: Trading chat is currently enabled. Usage: @trading <on|off>, @trading <message>. 955: Trading chat is currently disabled. Usage: @trading <on|off>, @trading <message>. 956: %s :Trading: %s 957: You cannot use Trading chat while muted. 958: You should enable trading chat with "@trading on" command. Save this file. 12 -> Open conf/inter_athena.conf and find this: // Nick for sending mainchat // messages like whisper main_chat_nick: Main Add below it: // Nick trading chat [darkmeisterp] sell_chat_nick: trading Save this file. 13 -> Open conf/atcommand_athena.conf and add at the end of the file: //Trading chat trading: 1,1 That´s all. Now you must compile your server and your new chat is ready! Here you have the diff for this mod. Enjoy it! newchat.patch1 point
-
Hi there , maybe i can help you with something , i add this mod manually , and got some bug , but now fixed Here you go Open src>char_sql>inter.c Find : else if(!strcmpi(w1,"main_chat_nick")) safestrncpy(main_chat_nick, w2, sizeof(main_chat_nick)); Add Below : else if(!strcmpi(w1,"trading_chat_nick")) safestrncpy(trading_chat_nick, w2, sizeof(trading_chat_nick)); From darkmeistersp , "Repeat the steps 7, 8 and 9 with the files char.c, inter.c and inter.h that are located in src/char_sql/" but from char_sql/inter.c its not the same with char/inter.c *darkmeistersp : sorry if im wrong , just helping because already tried and working , CMIIW *btw nice script1 point
-
@@ -4047,6 +4058,8 @@ if (sd && sd->fd) { //Tell sd that tbl walked into his view clif_getareachar_unit(sd,tbl); + if(tsd) + { + clif_sendaurastoone(sd,tsd); //Aura System + clif_sendaurastoone(tsd,sd); //Aura System + } } return 0; }1 point