Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 01/06/2023 in all areas

  1. Version 1.0.0

    50 downloads

    Small map for PVP fights It's an old map I made, it's small but can be used for 1v1 fights If creative, it can be used for any other event. (Free to the community)
    Free
    5 points
  2. Heya, These script commands are an alternative for those who do not want to use yaml for making barter shops. The shops can be reloaded by reloading the script, using the barter_clear command. The NPC location is defined just like a regular NPC and then using callshop <npc barter name>, just like regular shop types (which is already possible without this diff, but I thought I'd mention it anyway). Removes all items from a barter shop barter_clear <npc name>; Add item, not extended barter_add <npc name>,<item id>,<amount>,<req item id>,<req amount>; Add item, extended barter_add_ex <npc name>,<item id>,<amount>,<zeny>{,<req item id>,<req amount>,<req refine>}*; Here's a script example: prontera,150,188,0 script Barter NPC 77,{ mes "[Barter NPC]"; next; switch(select("Normal barter shop.:Extended barter shop.:")) { case 1: mes "[Barter NPC]"; mes "..."; close2; callshop "barter_test_npc"; end; case 2: mes "[Barter NPC]"; mes "..."; close2; callshop "barter_test_npc_ex"; end; } end; OnInit: barter_clear "barter_test_npc"; barter_add "barter_test_npc", 504, 10, 501, 20; barter_add "barter_test_npc", 504, 10, 502, 10; barter_add "barter_test_npc", "White_Potion", 10, "Yellow_Potion", 3; barter_clear "barter_test_npc_ex"; barter_add_ex "barter_test_npc_ex", "Zeny_Knife", 5, 5000, "Knife", 1, 9; barter_add_ex "barter_test_npc_ex", "Zeny_Knife", 5, 5000, "Knife", 1, 9, "White_Potion", 10, 0; barter_add_ex "barter_test_npc_ex", "Zeny_Knife", 5, 5000, "Knife", 1, 9, "White_Potion", 10, 0, "White_Potion", 10, 0; end; } prontera,152,188,0 script Barter NPC2 77,{ callshop "barter_test_npc"; end; } And here's the diff file: diff --git a/src/map/npc.cpp b/src/map/npc.cpp index d227467ed..37f50d94d 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -842,6 +842,26 @@ void BarterDatabase::loadingFinished(){ BarterDatabase barter_db; +struct npc_data* npc_create_dummy_barter_npc(const char *npcname) { + struct npc_data* nd = npc_create_npc(-1, 0, 0); + + npc_parsename(nd, npcname, nullptr, nullptr, __FILE__ ":" QUOTE(__LINE__)); + + nd->class_ = -1; + nd->speed = 200; + + nd->bl.type = BL_NPC; + nd->subtype = NPCTYPE_BARTER; + + nd->u.barter.extended = false; + + map_addiddb(&nd->bl); + + strdb_put(npcname_db, npcname, nd); + + return nd; +} + /** * Returns the viewdata for normal NPC classes. * @param class_: NPC class ID diff --git a/src/map/npc.hpp b/src/map/npc.hpp index 0a0c104e6..82ad2cf3d 100644 --- a/src/map/npc.hpp +++ b/src/map/npc.hpp @@ -1479,6 +1479,8 @@ enum e_npcv_status : uint8 { NPCVIEW_INVISIBLE = 0x29, NPCVIEW_CLOAK = 0x30, }; + +struct npc_data* npc_create_dummy_barter_npc(const char* npcname); struct view_data* npc_get_viewdata(int class_); int npc_chat_sub(struct block_list* bl, va_list ap); int npc_event_dequeue(map_session_data* sd,bool free_script_stack=true); diff --git a/src/map/script.cpp b/src/map/script.cpp index 5aeebe228..6742ab8c4 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -26916,6 +26916,154 @@ BUILDIN_FUNC(preg_match) { #endif } +/*========================================== + * Removes all items from a barter shop + * barter_clear <npc name>; + *------------------------------------------*/ +BUILDIN_FUNC(barter_clear) +{ + const char* npcname = script_getstr(st, 2); + std::shared_ptr<s_npc_barter> barter = barter_db.find(npcname); + + if (barter != nullptr) { + barter->items.clear(); + } + + return SCRIPT_CMD_SUCCESS; +} + +/*========================================== + * Add an item to the barter shop + * Not extended: + * barter_add <npc name>,<item id>,<amount>,<req item id>,<req amount>; + * + * Extended: + * barter_add_ex <npc name>,<item id>,<amount>,<zeny>{,<req item id>,<req amount>,<req refine>}*; + *------------------------------------------*/ +BUILDIN_FUNC(barter_add) +{ + const char* npcname = script_getstr(st, 2); + std::shared_ptr<s_npc_barter> barter = barter_db.find(npcname); + struct npc_data* nd = npc_name2id(npcname); + const char* command = script_getfuncname(st); + + if (barter == nullptr) { + barter = std::make_shared<s_npc_barter>(); + barter->name = npcname; + barter_db.put(npcname, barter); + } + + if (nd == nullptr) { + nd = npc_create_dummy_barter_npc(npcname); + } + + int index = barter->items.size(); + + std::shared_ptr<s_npc_barter_item> item = std::make_shared<s_npc_barter_item>(); + item->index = index; + barter->items[index] = item; + + if (strcmpi(command, "barter_add_ex") == 0) { + nd->u.barter.extended = true; + + if (script_isstring(st, 3)) { + const char* name = script_getstr(st, 3); + + std::shared_ptr<item_data> id = item_db.searchname(name); + + if (id == nullptr) { + ShowError("buildin_barter_add: Nonexistant item %s\n", name); + return SCRIPT_CMD_FAILURE; + } + + item->nameid = id->nameid; + } + else { + item->nameid = script_getnum(st, 3); + } + + item->stock = script_getnum(st, 4); + item->stockLimited = false; + item->price = script_getnum(st, 5); + + int offset = 6; + + while (script_hasdata(st, offset) && script_hasdata(st, offset + 1) && script_hasdata(st, offset + 2)) { + std::shared_ptr<s_npc_barter_requirement> requirement = std::make_shared<s_npc_barter_requirement>(); + + requirement->index = (uint16)item->requirements.size(); + + if (script_isstring(st, offset)) { + const char* name = script_getstr(st, offset); + + std::shared_ptr<item_data> id = item_db.searchname(name); + + if (id == nullptr) { + ShowError("buildin_barter_add: Nonexistant item %s\n", name); + return SCRIPT_CMD_FAILURE; + } + + requirement->nameid = id->nameid; + } + else { + requirement->nameid = script_getnum(st, offset); + } + + requirement->amount = script_getnum(st, offset + 1); + requirement->refine = script_getnum(st, offset + 2); + item->requirements[requirement->index] = requirement; + offset += 3; + } + } + else { + nd->u.barter.extended = false; + + if (script_isstring(st, 3)) { + const char* name = script_getstr(st, 3); + + std::shared_ptr<item_data> id = item_db.searchname(name); + + if (id == nullptr) { + ShowError("buildin_barter_add: Nonexistant item %s\n", name); + return SCRIPT_CMD_FAILURE; + } + + item->nameid = id->nameid; + } + else { + item->nameid = script_getnum(st, 3); + } + + item->stock = script_getnum(st, 4); + item->stockLimited = false; + + std::shared_ptr<s_npc_barter_requirement> requirement = std::make_shared<s_npc_barter_requirement>(); + + requirement->index = 0; + + if (script_isstring(st, 5)) { + const char* name = script_getstr(st, 5); + + std::shared_ptr<item_data> id = item_db.searchname(name); + + if (id == nullptr) { + ShowError("buildin_barter_add: Nonexistant item %s\n", name); + return SCRIPT_CMD_FAILURE; + } + + requirement->nameid = id->nameid; + } + else { + requirement->nameid = script_getnum(st, 5); + } + + requirement->amount = script_getnum(st, 6); + item->requirements[0] = requirement; + } + + return SCRIPT_CMD_SUCCESS; +} + /// script command definitions /// for an explanation on args, see add_buildin_func struct script_function buildin_func[] = { @@ -27623,6 +27771,10 @@ struct script_function buildin_func[] = { BUILDIN_DEF(isdead, "?"), BUILDIN_DEF(macro_detector, "?"), + BUILDIN_DEF(barter_clear, "s"), + BUILDIN_DEF(barter_add, "svi*"), + BUILDIN_DEF2(barter_add, "barter_add_ex", "svii*"), + #include "../custom/script_def.inc" {NULL,NULL,NULL}, Quick notes: There isn't a whole lot of error handling. Do... not use an existing NPC name for the barter name if you don't want to crash, but otherwise, should be fine! There is no handling for stocks. You can add parameters to it in the script command if you feel like it, but I've personally never used this option so I just didn't add it. barter.diff
    4 points
  3. Version 1.0.0

    121 downloads

    Since the new updates no longer include the command, its a modification of the old code created by zephyrus_cr, with the addition of the specific item link.
    Free
    3 points
  4. View File Prevent hitting mobs near NPC or Warper Hi, It's been a while since I posted anything.. As of now, I want to release this simple src mod that prevents players from hitting MVPs near an NPC/Warper. Purpose of this is to discourage players from going near warpers while hunting MVPs. I'm not sure how helpful this be but I just want to do something small for a while . I will be lurking around the request section to see some good ideas and might be releasing them here after! Cheers! Submitter pajodex Submitted 02/04/2023 Category Source Modifications Video Content Author pajodex  
    2 points
  5. View File HD 8Bit Damage Font I just updated the existed one by raPalooza~ to include the K and M indicator. DarkBreath is there too. The K is light green like a frog and the M is red wine like frog's blood Used font is PixelOperator 8 Submitter sapitosucio Submitted 02/02/2023 Category kRO Sprites Video Content Author raPalooza~, sapitosucio  
    2 points
  6. Hi, let me preface this post by saying that my artistic skills are limited but I tend to pour hours upon hours of work into projects to compensate. With that said I'd like to share a link to one of my github repos: https://github.com/eleriaqueen/rag-highres-scrolling-dmg-sprites For this project I make high-res (~8x higher resolution) sprites of popular/interesting/cool fonts I come across, in order to use them as digits for scrolling dmg. They are made using a faithful RO gradient so they probably won't look too out of place (hopefully). More stuff is coming, stay tuned, I'm hunting for the next interesting/cool/fun fonts when I have some free time. Latest Release: 2023/02/01 - Release 9 - Roboto
    2 points
  7. Pending approval: Updated item_vending_db.yml to Rapid YAML. Updated some deprecated functions regarding item database. Fixed an issue with bound item battle config. Updated to latest GitHash: d93d41
    2 points
  8. I was looking all over for a guide on how to make the World Map feature usable / customizable but I wasn't able to locate one. So, I just spent some time and figure it out. I was able to finish this little project and was satisfied with the outcome. I figured I'd share how it looks like. Special thanks to @Vy Low for letting me use his World Map jpeg. Video Preview: Screenshots: Changed a few colors here and there, but overall it looks good. Minimal Issue at all. Initial version : no mob levels yet, but will have this soon average level per map / dungeon. PS: No place to share it so I just selected the Client Support section.
    2 points
  9. View File All In One - Random Options Script The goal in this script is to allow you to create any random option enchantment system by just creating a new copy of this script , change the script name and setting You should be able to create any random option system exist currently in the game DO NOT PM ME FOR ERRORS Use the forum post to report for any bugs and errors the script allow you to create a group of items > you can create as many groups as you want each group has it's own options allow reroll or not put price for first time and price for the reroll after the first time the price can be zeny, cashpoints, custom points, items put random options for all slots or specific slot of the random options slot put exclusive random options groups so they cannot coexist in the same item The script config and example AT LINE 290 in the script file > OnInit: .exv = true;//DO NOT REMOVE THIS. .KeepItemData = true;//if this is 'false , the player will loss the refine+cards from the item when he use this npc. .CustomPointsVariable$ = "#COSTUMPOINTS";//The variable name of the costum points. .CustomPointsName$ = "Server RO Points";//The name of the costum points, this what the player will see. .HardBalance = true;//if this is true , it would be much harder to get high value in the random option. //AddGroup(<Group ID>,<ItemID>,<ItemID>,<ItemID>,<ItemID>,<ItemID>); /* AddGroup Doc <Group ID> = a number between 1 and MAX_INT64 DO NOT REUSE THE GROUP ID IN THE SAME FILE CONFIG! DO NOT REUSE THE SAME ITEM ID IN DIFFERENT GROUP! will create a group id you can add as many as you want items inside a group. */ //AddGroupOption(<Group ID>,<Allow ReRoll?true:false>,<Allow reuse already gotten option?true:false>,<Zeny Cost>,<CashPoint Cost>,<Custom Points Cost>,<Item1 ID Cost>,<Item1 Amount Cost>,<Item2 ID Cost>,<Item2 Amount Cost>,<....ETC>); /* AddGroupOption Doc <Group ID> = A group id that is already created in AddGroup()!. <Allow ReRoll?true:false> = allow reroll an item with random option or not <Allow reuse already gotten option?true:false> = for exammple if you have str in the options and the player gor it , can he get it again in another slot? */ //AddGroupCost(<Group ID>,<Zeny Cost>,<CashPoint Cost>,<Custom Points Cost>,<Item1 ID Cost>,<Item1 Amount Cost>,<Item2 ID Cost>,<Item2 Amount Cost>,<....ETC>); /* AddGroupCost Doc <Group ID> = A group id that is already created in AddGroup()!. <Zeny Cost> = the zeny cost (can be 0) <CashPoint Cost> = the cashpoints cost (can be 0) <Custom Points Cost> = if you are using costum points in the script , check out .CustomPointsVariable$ and .CustomPointsName$ at the start of the script (can be 0) <Item1 ID Cost> = the item cost <Item1 Amount Cost> = the item amount cost You can use as many item,amount cost at the end of the function. */ //AddGroupReRollCost(<Group ID>,<Zeny Cost>,<CashPoint Cost>,<Custom Points Cost>,<Item1 ID Cost>,<Item1 Amount Cost>,<Item2 ID Cost>,<Item2 Amount Cost>,<....ETC>); /* AddGroupReRollCost Doc <Group ID> = A group id that is already created in AddGroup()!. <Zeny Cost> = the zeny cost (can be 0) <CashPoint Cost> = the cashpoints cost (can be 0) <Custom Points Cost> = if you are using costum points in the script , check out .CustomPointsVariable$ and .CustomPointsName$ at the start of the script (can be 0) <Item1 ID Cost> = the item cost <Item1 Amount Cost> = the item amount cost You can use as many item,amount cost at the end of the function. */ //AddGroupChance(<Group ID>,<1st Option Chance>,<2nd Option Chance>,<3rd Option Chance>,<4th Option Chance>,<5th Option Chance>); /* AddGroupChance Doc <Group ID> = A group id that is already created in AddGroup()!. <1st Option Chance> = the Chance to get one of the random options in the slot 1 (can be 0) <2nd Option Chance> = the Chance to get one of the random options in the slot 2 (can be 0) <3rd Option Chance> = the Chance to get one of the random options in the slot 3 (can be 0) <4th Option Chance> = the Chance to get one of the random options in the slot 4 (can be 0) <5th Option Chance> = the Chance to get one of the random options in the slot 5 (can be 0) Keep inmind that if the player didn't get lucky for example at the slot 2 , all the chances after will be ignored you cannot skip a random option slot that would bug the game client. */ //AddOpt(<Group ID>,<Location>,<Random Option ID>,<Minimum Value>,<Maximum Value>); /* AddOpt Doc <Group ID> = A group id that is already created in AddGroup()!. <Location> = you can spisfiy random option to a location from 1 to 5 , but you can use 0 , if you used 0 it will apply to all locations that doesn't have spisfied random options. <Random Option ID> = random option id , you can use the id or the variable , check out the file /rathena/db/re/item_randomopt_db.yml <Minimum Value> = the minimum value <Maximum Value> = the maximum value */ //AddExclusiveOpt(<Random Option ID>,<Random Option ID>,<Random Option ID>,<Random Option ID>,<Random Option ID>); /* AddExclusiveOpt Doc this will help you to prevent a group of random opions typs in the same item in different slots for example RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET RDMOPT_DAMAGE_PROPERTY_WATER_TARGET RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET RDMOPT_DAMAGE_PROPERTY_WIND_TARGET RDMOPT_DAMAGE_PROPERTY_POISON_TARGET RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET if the player got 1 of them in a slot , he wont get another one to another slot */ //Example!!!> //this is just an example , this script allow you to create any random option system you want. //Creating Group id 1 , with Hat items inside. AddGroup(1,2220,2221,2222,2223); //Group id 1 Options AddGroupOption(1,true,false); //Group id 1 Cost AddGroupCost(1,50,0,0,502,1,503,2); //Group id 1 ReRoll Cost AddGroupReRollCost(1,50,0,0,502,5,503,2); //Group id 1 Chances. AddGroupChance(1,100,75,60,40,20);AddGroupChance(1,100,100,100,100,100); //Group id 1 Random Option List. location 0 mean all the slot locations AddOpt(1,0,RDMOPT_VAR_STRAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_INTAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_VITAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_LUKAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_AGIAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_DEXAMOUNT,1,100); AddOpt(1,0,RDMOPT_VAR_MAXHPPERCENT,1,100); AddOpt(1,0,RDMOPT_VAR_MAXSPPERCENT,1,100); //those enchantment you wont get unless in slot 5 AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,1,100); AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,1,100); //this mean those random options cannot coexist in the same item!. AddExclusiveOpt(RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET, RDMOPT_DAMAGE_PROPERTY_WATER_TARGET, RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET, RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET, RDMOPT_DAMAGE_PROPERTY_WIND_TARGET, RDMOPT_DAMAGE_PROPERTY_POISON_TARGET, RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET, RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET, RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET, RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET); end; https://sader1992.com/ Submitter sader1992 Submitted 09/09/2021 Category Utilities Video Content Author sader1992  
    1 point
  10. just delete the cache in data/tmp/
    1 point
  11. depend on your script, you can do like these if (condition_A) { select("Menu 1", "Menu 2", "Menu 3"); } else { select("Menu 4", "Menu 5", "Menu 6"); } or select((condition_A ? "Menu 1" : ""), (condition_A ? "Menu 2" : ""), (condition_A ? "Menu 3" : ""), "Menu 4", "Menu 5", "Menu 6"); etc
    1 point
  12. In Nemo Patcher, you need to enable 'Change new char name field height'. Maybe u can try 20 as the input.
    1 point
  13. add the missing sprites
    1 point
  14. try with this - script KillMon2Cash -1,{ OnNPCKillEvent: [email protected] = gettimetick(2); if (rand(100) < 1 && [email protected] > @delay) { getitem 50001,1; @delay = [email protected] + 60; // 60 seconds } end; OnInit: bindatcmd "check", "KillMon2Cash::OnCheckTime"; end; OnCheckTime: if (( @delay - gettimetick(2)) <=0 ) message strcharinfo(0),"Your next drop is ready!"; else message strcharinfo(0),"Next drop in "+ ( @delay - gettimetick(2) ) + " seconds."; end; }
    1 point
  15. If you had a legal team of any kind, they would tell you to stay the hell away from running a private server. Your team need to be fired. Also, this is not the correct location for hiring staff - see: https://rathena.org/board/jobs_available/
    1 point
  16. Been on a little bit of a break after all the work I did on RO recently, but I've been filling in a bit of content here and there. For starters, I finally got marriage working. The custom marriage script that came with my distribution had a few bugs. I'm not sure if they are fixed in the latest version, but I've included the fixed version in this post. Here's the happy couple. (Not pictured their previous 6 divorces while I debugged the script) In order for this to work, the wedding rings need to be marked as married partner tradeable, which they weren't initially in my distribution (this is bit flag 511 in item-trade.txt). Also, for some reason, the Tuxedo was marked as an etc item, I restored it to being an equippable item as it was before. I've also been adding some new stuff here and there. For starters, there's now a new dungeon in Jawaii called the Tunnel of Love. It's accessed via this NPC in Jawaii. This place is pretty unique. For starters, he won't even let you in if you don't have your wedding ring equipped, and if you take it off in the dungeon you get warped out (this is achieved via an unequip script on the wedding ring, which only activates on this particular map). The map itself is a reskinned version of Beach Cave North, but it plays track 172, which I think fits well with it. There are a couple new enemies here and a new boss, but it also has a lot of pairs of enemies like Poporing and Marin, and Bongun and Munak. The boss is a fairly unique one called The Lovers, which consists of two boss-like entities who have comparable power. The female is the "main boss", if you defeat her they both die, and the male enemy is the summon, but she will only summon him on spawn and never resummons him if he dies. As long as he's alive, he tries to heal her and cast buffs on her, so you kind of want to target him first, but she starts using NPC_POWERUP once he goes down (this uses the same check on number of living slaves that bosses typically use to respawn their summons). They drop a couple different things, but the real prize is the Lovers' Ring, a slotted accessory that gives an incredible +2 to all stats, making it easily the best accessory in the game. The catch is that it only works if you're also equipping your wedding ring in the other slot, which significantly limits its power. Actually, pretty much everything unique you can get in here is connected to the wedding ring in some way. I mainly wanted a way to make wearing the wedding ring kinda viable. Obviously, under normal circumstances you just keep it in your inventory and only swap to it when you want to use the wedding skills, but I think this gives you some fun options if you'd prefer to keep it equipped. This also means that for characters who are single, the fact that they can't come to this dungeon isn't a big deal. I also added a boss based on Red Scar from Ragnarok 2 to the Cave Dungeon in the past. This area bares some resemblance to where you fight him in RO2 and RO2 takes place in the past compared to RO1, so I thought it was a fun little touch. He's quite an easy boss, not much more powerful than GTB, which makes sense because he was one of RO2's earliest bosses and this area is one of the first you can access in the past. I also don't know if I ever talked about the Humanoid Chimera pet. She's the hardest pet to get in the entire game (she requires killing T_W_O, who is close to Satan Morroc in power), but her pet skill is that she can give you Soul Link. This actually uses a completely new skill called "SL_OMNI" which calls all of the other soul link spells depending on the target's class. You might be wondering how I created these new bosses. Actually, it was very easy. You can probably tell that they're using the sprites of existing enemies, namely Succubus, Incubus, and Desert Wolf. RO has a file in the System subfolder under the client folder (this is also where iteminfo.lub) is located that the game uses to dynamically apply certain sprite effects to various enemies. They use this to create quite a number of the enemies in the game. The file is monster_size_effect_sak_new.lub. It's quite easy to understand and modify, the entries in the list are just the Monster IDs, then there's a list of effects to apply to them. For Red Scar, his effects look like this. [2546] = { MonsterSize = 1.5, MonsterEff = { EFFECT.EF_GREEN99_3, EFFECT.EF_GREEN99_5, EFFECT.EF_GREEN99_6, EFFECT.EF_REDLIGHTBODY } }, So what this does is it takes Desert Wolf's sprite, makes it 1.5x the size, then applies 4 effects to it. The first 3 create the "boss aura", while the last colours him red. And presto! It's a vaguely new enemy sprite! In terms of things that weren't so simple, there's also this place. This is the Endless Sands dungeon, which is found in the past. Unlike other things I added, this is a totally new map that I made from scratch. It's not fancy or anything, it's mostly just some bumpy terrain with some cacti and a sand texture, but I like it. This dungeon is also a maze, where each screen has multiple exits but only one leads forward. The Pixy Porings also appear here, and they have pretty good stuff, though they're pretty strong for porings. Should you make it to the exit, you can reach Valhalla! It's actually just the Lasagna field maps, but I think it looks kind of heavenly. This is the most dangerous area in the entire game. There's a ton of new enemies and gear here, but the enemies have comparable power to Odin's Tower and since this is in the past all enemies deal double damage and take only half. Defeating the Wish Maiden (who actually uses a different sprite that's from a newer version of the game) will not be easy. You're probably going to want at least a couple boss cards before you come here. I feel like I'm probably mostly done with PVE content now, the next big thing I'll have to figure out is all the PVP stuff. The amount of stuff to fiddle with never ends. marriage.txt
    1 point
  17. Hello, I have been trying to withdraw my money, money which has been on this page for more than 6 months, I already sent the request to withdraw the money, it only allows me to withdraw $10 each day and I have been waiting for more than 20 days since I sent the first request and I don't see any response
    1 point
  18. - script KillMon2Cash -1,{ OnNPCKillEvent: [email protected] = gettimetick(2); if (rand(100) < 1 && [email protected] > @delay) { getitem 50001,1; @delay = [email protected] + 60; // 60 seconds } end; }
    1 point
  19. It's not what you want but i think it's the same as what it does use the Card Trader 1.1 here https://rathena.org/board/topic/64394-✰-euphys-scripts-✰/ you can instantly sell the cards via shop
    1 point
  20. View File Usable Enchant Item Description : Players are able to click on the Enchant items to provide custom bonus to the selected equipment. Varies of bonus could be done especially use together with a *getequippedon script command to provide a wide range of bonuses. The current items and bonuses display in the video is just a sample for demo. The origin of the idea come from Diablo and 張阿神. Sample Usage: callfunc("F_UsableEnchantItem", <delete_item_id>, <enchant_item_id>{, <card_index>}); Item Database : Create a custom item for enchant - Id: 501 AegisName: Red_Potion_Enchant_Usable Name: Red Potion Type: DelayConsume Buy: 10 Weight: 70 Script: | callfunc("F_UsableEnchantItem", 501, 909, 3); Create a custom enchant item with special bonuses. - Id: 909 AegisName: Jellopy_Enchant_Item Name: Jellopy Type: Etc Buy: 6 Weight: 10 Flags: BuyingStore: true Script: | [email protected] = getequippedon(); if ([email protected] & EQP_ARMOR) { bonus bVit,100; } if ([email protected] & EQP_HEAD_TOP) { bonus bInt,100; } if ([email protected] & EQP_SHOES) { bonus bAgi,100; } Preview : Submitter Emistry Submitted 01/17/2016 Category Utilities Video https://www.youtube.com/watch?v=dFivhLs1zeE Content Author Emistry  
    1 point
  21. Need the latest kRO Install folder for your private server? Look no further! ----> Download <---- Latest: 2022-07-21 Installation: Official kRO Updated: 22/07/2022 Download Link: https://mega.nz/folder/jUsDgRxQ#ttLmLjPY9p9cfU5_ShWVCw Package contains RSU RO Patcher Lite for kRO and kRO RE by [Ai4rei] This package is maintained by [Akkarin] Note: Due to continued abuse of my webservers, the files have been moved to MEGA. You can download an extractable .zip of an installed kRO directory, or you can download the official installer from kRO's website. Note: If you require older maps that are compatible with 2021 and older clients, download the 2021 .zip instead of the 2022 .zip. A fan of this topic? Hit the rep button
    1 point
  22. You are missing of file .. You need to update your client files
    1 point
  23. I put up a guide on how to make a custom pet in another part of the forum which goes over everything about making them in a lot of detail. The short version is that you need to modify petinfo.lub, which is stored inside the datainfo folder (you can just search for it with GRF editor). Of course, you need to add the new illustration to the GRF file as well. If you want to make the pets talk, that's also in the GRF file, in pettalktable.xml. The thread explains more about how to modify these. As for the images, I'd love to say there's an easy way to get these, but there's not really. I just search for the pet I want to make on Google, and if there's a good piece of fanart, I use that, if not, I meticulously edit the card art. In some cases I even have to redraw parts of the art that are cut off, for example in the picture above the card art actually cuts off Pere's fingers on one hand so I had to draw them, luckily the resolution is low so you can't tell. Of course, if you're not a crazy person you could just use one of their sprites or something, which I did for a couple monsters whose card art wasn't suitable.
    1 point
  24. A small update this time, but something I'm quite pleased with. Meet Pere! Players of Renewal might recognize Pere from Jitterbug of Nightmare, which I recently implemented on my server. (Which, as mentioned above, is PRE-RE, I've been porting all of Renewal's content to it). Pere is quite special. Besides being super cute, she can also serve as your ensemble partner! There are two Peres that you can get as pets, one dances and one plays the guitar, and whichever one you are, you need the other one. Someone on my server has been complaining since day 1 about the necessity of being joined at the hip with a Bard and I think this is a good compromise that preserves the intent of the ensemble skills while also making them a little more accessible. If you want to add this functionality to your server, it's actually pretty easy from a coding perspective. You just have to find the method "skill_check_condition_castbegin" in skill.cpp, then find this code: else if(inf2[INF2_ISENSEMBLE]) { if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->data[SC_KVASIR_SONATA])) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } } And replace it with this: else if(inf2[INF2_ISENSEMBLE]) { // check to see if we have the ensemble pet bool ensemblepet = false; if (sd && sd->pd) { if ((sd->status.class_ == JOB_BARD || sd->status.class_ == JOB_CLOWN) && sd->pd->pet.class_ == 3069 && sd->pd->pet.intimate > PET_INTIMATE_LOYAL) { ensemblepet = true; } if ((sd->status.class_ == JOB_DANCER || sd->status.class_ == JOB_GYPSY) && sd->pd->pet.class_ == 3070 && sd->pd->pet.intimate > PET_INTIMATE_LOYAL) { ensemblepet = true; } } if (!ensemblepet && skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->data[SC_KVASIR_SONATA])) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } } Of course, you also have to pull everything from Jitterbug of Nightmare into PRE-RE, then implement the Peres as custom pets, but at least the coding part is simple! (alternatively, you could just use a different pet, like maybe a Rocker or something, you can just change the id number it looks for in the pet.class_ part).
    1 point
  25. I've been fiddling a lot with skills lately. For starters, I've been playing Sage. Sage has always felt like a bit of an underwhelming class to me. A big part of this is that it gets very few new damage spells. So I made a new one. Poison Splash is basically just Poison-element Fire Ball, it does AOE Magic Poison damage and can also inflict the Poison status. On my server, Poison does extra damage against Neutral (I think this makes sense, since Assassins use it and the main targets that are Neutral are players), so this spell is quite useful against Ridewords and the like. I also think it works well for Sage since Sage is intended to be a PVP-focused Mage and this is a pretty decent PVP spell. That said, you have to watch out because a number of enemies can cast this spell against you! I also buffed Professor's Memorize skill, which I've renamed to Lecture. Like the Summoner Buffs, it now also applies this buff to all party members on the screen. I think this makes thematic sense with the class being called "Professor" but doing no actual teaching previously. It was also a move which, in my opinion, didn't have a ton of utility for Professor, as they tend to either use fast-casting spells or autocast, but has a ton of potentially interesting utility for other characters and enhances the "Support Sage" playstyle. Beyond this, something I think is super cool is that I've added some cards that allow you to cast previously enemy-only skills. For example, here my Paladin has the Dark Priest Card, which allows you to cast Soul Strike of Darkness. It even has a proper description in the skill window and everything. This was surprisingly painless to pull off. You need to add entries for the enemy spells (in this case NPC_DARKSTRIKE) to skilldescript.lub and skillinfolist.lub (these are in the GRF file under skillinfoz), and add entries for the spell in skill-cast-db and skill-require-db and that's about it, then just have the card script look something like "skill "NPC_DARKSTRIKE", 5;" and you're good to go. I have cards like this for Grand Darkness, Darkness Jupitel, Blood Drain, and Energy Drain, but none of them are easy to get your hands on. Still, it's cool to have more options for dealing Darkness damage. I also almost completely reworked Endless Tower. For starters, I moved it. It was originally accessed via Alberta, like far too much of the game (like 8 different towns are accessed through there), so it's now where Misty Forest Labyrinth used to be at Bifrost Field 1. The condition where you have to wait a week between attempts is also now gone, you can now play it as much as you like, but creating the instance costs 500k Zeny. The difficulty of the tower has also been rebalanced. Previously, it was kind of ludicrous, forcing you to fight many of the hardest bosses in the game, like Ifrit and Beelzebub. You now generally fight the low to mid tier bosses, with a number of bosses who didn't previously appear in the tower, like Gopinich, Boitata, and Stormy Knight making an appearance. I also tweaked the enemies that spawn on pretty much every floor. There's generally less of them, and they're themed based on various locations in the game. For example, can you identify the map that this floor is based on? I also gave Endless Tower a huge music buff, in that it now plays the previously unused track 168 (well, this is used for Lasanga dungeon in Renewal, but that map isn't in Pre-Re), which I think fits perfectly with this dungeon. If you ever want to edit which songs play where, this is very easily done by editing mp3nametable.txt, which is in root folder of one of your GRF files. (I also restored Track 67, which currently doesn't play anywhere, it now plays on the maps north of Yuno). There are also kafras and shops within Endless Tower (though the Kafras only allow you to use the storage. no saving), to somewhat mitigate how absurdly many items you tend to get here. Additionally, when you clear floors 25, 50, 75, and 99, the warp in the first room is replaced with a new warp that takes you to the appropriate floor (the concept of the Ashes is removed). Overall, I think this makes this dungeon a lot more fun.
    1 point
  26. Hello and Good Day guys! It's nice to be back in the world of mapping! Here is a new look for Prontera! Check the in-game screenshot here, Hope you like it guys.
    1 point
  27. My cat is finally rebirthed! I can't believe nothing broke! He even got the correct number of status points and everything. I'm the king of scripting. Back to Toy Factory for me. Now I can learn the cat's (originally) post level-100 skills. Besides all the new content, my server also has a boatload of skill tweaks (this is part of why I don't just share my code directly, there's hundreds of changes most people probably won't want). For example, the first skill in each of the cat skill trees can now level to 10 instead of 5, to give you more options in terms of how you spend your points pre-rebirth. The initial skills for Summoner are also buffed, particularly the nearly-useless Bite and Scratch. These are both worthless 200% damage skills initially, that you would literally never use once you have anything else. I tweaked it so that they now have 100 + <your base level> * 10 % attack, (only *5 for scratch). Bite also has a chance to Stun and does more damage to weakened targets, making them very viable at high levels, with the caveat that Bite is a melee skill with cast time, so unless you have uninterruptable cast, a ton of flee, or tons of cast speed reduction you're going to get hit out of it a lot. At any rate, I think this is interesting because this now means you could go healer cat and have a fairly viable form of offense that requires no further skill point investment, though obviously the loss of the range from Picky Peck is an issue. Soul Attack is also now a 5-level skill which functions similarly to a mastery skill, and enables long range attack at maximum level. This is a fairly substantial nerf, but mastery skills on my server work like they do in the newest version of the game, where they increase your atk rather than final damage, so they're not worthless. Summoner also has, initially, probably the single most broken skill in the game in Silvervine Root Twist. This is a ranged skill with instant cast that completely freezes the enemy's movement with 100% success rate for 10+ seconds. I shouldn't need to tell you how ludicrously busted this is on a character that has powerful ranged attacks. The second you learn this skill, you are essentially completely invincible to almost all normal mobs. I was able to waltz into area 30+ levels above me with no issues by just grabbing anyone who looked at me funny. I have no clue who looked at this skill and thought this was fine. Obviously this had to be adjusted. On my server, Silvervine Root Twist has a 1.5 second cast time and about 1/4 the duration (4 sec at max level). It's still a ludicrously good skill which I think almost any build wants to take, but it no longer completely explodes the game balance. Stop hitting me! I'm supposed to be invincible! (Not pictured: my untimely death) On the flip side, Scar of Tarou is greatly buffed, in that the damage over time effect is greater and can work on bosses (albeit at only 25% of the power) if you have Spirit of Life. With the aid of a powerful tank, Scar of Tarou can handle almost all your DPS needs, so that could be another interesting option for support cat. The only issue is that its power scales with STR instead of DEX, as it does in the base game, so if you have no STR it will be weak. Speaking of, I've even tweaked the way the stats work slightly. For example, every time you get 10 VIT, you now get a point of DEF. I always thought it worked this way initially, but apparently it never did. Well, now that I have absolute power, I can make it work however I want. Actually, every stat gives you some kind of bonus for every 10 points now. The sky's the limit in terms of what you can do with this game. I've tried to generally stick to (my interpretation of) the general balancing of the game prior to the battlegrounds update, since I wanted to make the game what I think it might have become if Renewal had never existed, but you could take it in pretty much any direction you want. This game really is a modder's dream come true.
    1 point
  28. in the mob_dead(...) search for drop_rate = mob_getdroprate(src, md->db, md->db->dropitem[i].rate, drop_modifier); replace with if (it->type == IT_CARD) drop_rate = md->db->dropitem[i].rate; else drop_rate = mob_getdroprate(src, md->db, md->db->dropitem[i].rate, drop_modifier); hmm... nvm this actually removed all modifier. it probably better if you pass the item type into drop_rate = mob_getdroprate(src, md->db, md->db->dropitem[i].rate, drop_modifier, it); then int mob_getdroprate(struct block_list *src, std::shared_ptr<s_mob_db> mob, int base_rate, int drop_modifier,struct item_data it) then add the item type checking to skip if its card and is vip if (pc_isvip(sd) && it->type != IT_CARD) { // Increase item drop rate for VIP.
    1 point
  29. Hello sorry for commenting on old post, I have a same issue about statpoints and I follow your advice about commenting on RENEWAL_STATS but on RENEWAL_ASPD even I already comment it still I have MAX ASPD even i dont have stats (1agi = max aspd).
    1 point
  30. Version 1.2

    338 downloads

    Each day a random dungeon will be picked, monsters killed inside the dungeon of the day will give extra EXP, Items and Zeny, the percentage to get these is configurable within the script. Accepting suggestions to improve this script.
    Free
    1 point
  31. Bards and dancers can use the "Compose" skill to play melody for everyone around them, and in addition a donation box is placed next to them, where other passing players can give zeny's to encourage the street musician to continue his work and feed your family! Musicians cannot open a songwriting area in the same view as each other, so it's your chance to grab the best spot to perform your musics!
    1 point
  32. Hello Everyone, Good day! I can't recompile my server at this moment due to error msg of " GCC versions older than GCC 5 are not officially supported anymore" Here is my GCC version: [[email protected] ~]# gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. tried so many guides over rathena but nothing works btw I run ( scl enable devtoolset-7 bash ) before I put the command " make server "
    1 point
  33. Resolved by the below centos commands: sudo yum install centos-release-scl sudo yum install devtoolset-7-gcc* scl enable devtoolset-7 bash which gcc gcc --version
    1 point
  34. Updated to 2.14.2, adds /mable and /zoom, updates Japanese and Russian translation and fixes UI glitches and a bug in logging.
    1 point
  35. Version 1.0.0

    368 downloads

    Hi, there! this functions is ideal for newbie scripters or just someone who wants to "add" or "modify" scripts with rewards. It may be item or variables such as points or stuff... This function can also be used by experienced scripters who are lazy to code and stuff xD. Easy to use and all Here are the sample npcs on how to use it. (included in the downloadable files) // Sample NPC for using F_Reward_Item and F_Reward_Var // For beginners. prontera,150,180,0 script F_Reward_Test 123,{ mes "What do you want to get?"; switch(select("Item","Points")) { case 1: F_Reward_Item("501:10,502:5,503:10"); break; case 2: F_Reward_Var("#CASHPOINTS","Cash Points",100); break; } mes "Enjoy!"; close; } // This is just a pseudo-code, you can understand what I mean by this xD // For advance scripters. You can do something like. prontera,150,180,0 script F_Reward_Test 123,{ mes "get items"; close2; F_Reward_Item(.itemlist$); end; OnInit: .itemlist$ = "501:10,502:5,503:10"; end; } I hope this will help! Keep those upvotes coming to motivate me moooore Enjoy the rest of the day!
    Free
    1 point
  36. Hi there, I downloaded the script from that link and I still get: [Error]: buildin_getmapxy: Player with nick 'ECwarp_1' is not found. [Error]: buildin_getmapxy: Player with map id '0' is not found. [Info]: [Instance] Created: Endless Cellar (1). Edit: Fixed it. There was a getmapxy([email protected]$,[email protected],[email protected],1,("ECwarp_"+'EC_Floor)); which needed to be getmapxy([email protected]$,[email protected],[email protected],BL_NPC,("ECwarp_"+'EC_Floor));
    1 point
  37. View File OnPCLootEvent New NPC Label OnPCLootEvent: This label triggers when a player picks up an item from the ground in a map marked with the 'lootevent' mapflag. This works with @autoloot and @alootid, this does not work for items given by script. When in a party with shared loot, only the player who looted the item from the ground will trigger this label. The information of the item picked up will be stored in an array called '@looted_data', check the script_commands.txt for the order of the data stored. Usage Sample: lootevent_sample.txt Submitter joecalis Submitted 05/27/2018 Category Source Modifications Video Content Author joecalis  
    1 point
  38. Version 1.0.0

    95 downloads

    So the example usage for Sub-query part of Pull: 3272 can be tested by using this FluxCP Addon: Char Deletion Code for #3272. No source mod needed (iirc lol). The plot is to not using birthdate, email, nor pincode as deletion code for deleting character (the confirmation part after the char deletion date's turned blue). The code will be sent into the registered e-mail. This is not OTP (one true pair couple... errrr One-time Password) but has expiration time, so make sure your FluxCP has same timezone with your server timezone (don't ask me). Requirements Have this Pull Request merged into your working rAthena Pull: 3272 For FluxCP from https://github.com/rathena/FluxCP Tested only after https://github.com/rathena/FluxCP/commit/e0fa6a8347db17de99b3fe0926dc87c0769262fc Make sure your server enable to send e-mail You can edit the addons/delcode/module/create.php to disable Captcha check or merge this PR to your FluxCP https://github.com/rathena/FluxCP/pull/196 Installations Import table from char_delcode.sql into database that has your login table Copy addons/delcode directory to your FluxCP's addons directory Edit the char_deletion_code value to char_deletion_code: (SELECT `delcode` FROM `char_delcode` WHERE `account_id`=`login`.`account_id` AND `expired` > NOW() ORDER BY `id` DESC LIMIT 1) Copy data/templates/delcode.php to data/templates directory on your FluxCP's That's all Example Usage PS: The menu labels were edited
    Free
    1 point
  39. Version 2.6.4.8B

    18,190 downloads

    Please do not send me private message as my response would be in lowest priority. 2.6.4.0 UPDATE IMPORTANT NOTICE: Not only this release is beta, there are few important changes need to note of: You now may modify the icon, code sign after pack configuration data. Some configuration entries are deprecated. Additionally, as you can tell, script support is coming... System Requirement: Windows 2000 or higher. Features Pack into single/multi grf file(s) [0x200] Automatically generates GRF if not exist RGZ support Customizable skin & language entries Background music No extra dll, not even config file is needed when distribute. Embed config file and resource data (images for background/buttons) Custom Button Remote config file Self update and client update [supports multi client exe update(Up to 255)] Tools ConfigGenerator - Packs configuration and resources into the patcher or generate as a binary config pack. ThorMaker - make patch files into thor file, there two options file & grf, when choose file, the patcher will extract file into disk, and grf simply put in GRF. [Please do not pack GRF, instead you should pack the actual data.] CheckSum - Simply a crc32 tool, used to make sure patcher & client/game exe is up to date ======================== Internal Config and Remote Config: Internal config is simply the one embed inside patcher, store basic information required to run Remote config, is on web server (of course), it used configure extended features.
    Free
    1 point
  40. Version 1.0.0

    899 downloads

    OnInit: // settings .char_bound = 1; // enable character bound rewards (1 = on || 0 = off) .account_bound = 1; // enable account bound rewards (1 = on || 0 = off) // set item (char bound) setarray .char_reward, 501, 502, 503; // item setarray .char_reward_amt, 1, 2, 4; // amount // set item (acc bound) setarray .acc_reward, 501, 502, 503; // item setarray .acc_reward_amt, 1, 2, 4; // amount Use and edit this to any ways you need. I just made another simple freebies npc.. This is in reponse to many new server owners who kept asking "how to make freebies account bound/char bound?" or such. I made it easier for them to choose whether to enable char/acc bound rewards or not. Enjoy
    Free
    1 point
  41. Version 1.0.0

    867 downloads

    This system is already activated in the source of the brAthena. It was created by Orce, and with my friend's help, we converted to rA, and it's working perfectly with the last revision Language: PT-BR, EN-US Ps. Sorry my english
    Free
    1 point
  42. You can get unpacked Clients here https://github.com/zackdreaver/UnpackedkROclients +Rep is I helped
    1 point
  43. Version 2.0

    1,730 downloads

    The VIP Lounge. A perfect spot for players with exclusive priviliges can mingle at~. Comes with several rooms and an outdoor field. Note: You will NOT see the purple border in the map. It's for design purposes
    Free
    1 point
  44. Do you also do skill icons?
    1 point
  45. prontera,150,190,5 script Test 100,{ [email protected] = 100 * Weight / MaxWeight; if (50 <= [email protected]) { mes "You are currently at " + [email protected] + " percent of your maximum weight."; close; } mes "Your weight is ok."; close; }
    1 point
  46. a new technique has been found in this topic, by abusing SQL table to save the kills so this will effectively break the limit of player data storage, rendering it unlimited /* create table last_pvp_kill ( id int(11) unsigned primary key auto_increment, killercid int(11) unsigned not null, killedcid int(11) unsigned not null, count smallint(6) unsigned, key (killercid), key (killedcid) ) engine = innodb; */ - script jfhdksfjhsk -1,{ OnClock0000: query_sql "truncate last_pvp_kill;"; end; OnPCKillEvent: if ( killedrid == getcharid(3) ) end; if ( query_sql( "select count from last_pvp_kill where killercid = "+( [email protected] = getcharid(0) )+" and killedcid = "+( [email protected] = getcharid( 0, rid2name( killedrid ) ) ), [email protected] ) ) { // check if the user is in the list if ( [email protected] == .max_skull ) { dispbottom "you have reach the max amount of skull for that player today"; end; } query_sql "update last_pvp_kill set count = count +1 where killercid = "+ [email protected] +" and killedcid = "+ [email protected]; } else query_sql "insert into last_pvp_kill values ( null, "+ [email protected] +", "+ [email protected] +", 1 )"; // insert into table getitem2 7420, 1,1,0,0, 254, 0, [email protected] % ( 1 << 16 ), [email protected] >> 16; end; OnInit: .max_skull = 3; end; }
    1 point
  47. @Joseph script is closest, but not optimized enough prontera,156,177,5 script kdjfhkshf2 100,{ end; OnInit: [email protected] = 5; [email protected] = 5; while (1) { sleep [email protected] * 1000; getmapxy [email protected]$, [email protected], [email protected], 1; while ( checkcell( [email protected]$, [email protected]_x = [email protected] + rand( [email protected], [email protected] ), [email protected]_y = [email protected] + rand( [email protected], [email protected] ), cell_chknopass ) ); npcwalkto [email protected]_x, [email protected]_y; npctalk callfunc( "F_RandMes", 2, "I'm talking.", // 1 "Hello!" // 2 ); } end; // doesn't read } F_RandMes is 1 of the global function inside our svn its much cleaner than setting an array with getarraysize also much cleaner than switch( rand(x) ) { case 1: ... break; case2: .... break; } our crappy script engine parse switch, case and break very ugly F_RandMes is also consider 1 of the unique function only to *athena script language
    1 point
  48. huh ? month reward but cant claim again on next month ??? are you looking for a npc that give Item Monthly ?? try this prontera,155,181,5 script Sample 757,{ // January ~ December Item Lists setarray .ItemID[0],7539,5022,512,607,608,7539,5022,512,607,608,7539,5022; setarray .Amount[0],1,2,3,4,5,6,7,8,9,10,11,12; if( #MonthlyReward != gettime(6) ){ getitem .ItemID[gettime(6)],.Amount[gettime(6)]; set #MonthlyReward,gettime(6); mes "You have grant an item for this month."; }else{ mes "You cant take a reward again this month."; } close; }
    1 point
×
×
  • Create New...