Habilis

Members
  • Content count

    220
  • Joined

  • Last visited

  • Days Won

    17

Everything posted by Habilis

  1. View File [NPC] Campfire to regenerate HP/SP Originally: There is a nice contribution from meko on that subject, Menhir (Big rock that possesses magical powers and able to restore Health and Energy of Seekers resting/meditating nearby) Thanks, meko! But, I thought to myself, well, that is wonderful, but why not make it portable? The Idea: An element of role play, a way to add functionality to the item 7035 - Matchstick, To light a Campfire. A Campfire is a portable temporary regeneration NPC. OW, and it is configurable ;). Campfire to restore / regenerate HP & SP. When you sit by the Campfire, you start feeling the warmth and the comfort, thus your HP & SP begin to regenerate. Mechanics : A phosphorus tipped stick that can be used to start a fire. (Now Indeed ) When you use the item Matchstick in your inventory, it will spawn a duplicate of the NPC called Campfire. This will help you when you are in the field, farming, grinding, starting a Campfire will help you rest. - You need to sit close to the Campfire (3 cells ) to feel the warmth. - Anyone can sit by your Campfire and rest. - Campfire lasts 2-3 minutes. - Need to sit for at least some time to begin feeling the warmth and comfort. - you cannot start a fire within 5 cells of another NPC - If you use a match one more time, old Campfire disappears and a new one appears. I think it will add an element of roleplay and romanticism to the gameplay. Installation : To be able to use this script you need a plugin npc-duplicate.c https://github.com/dastgirp/HPM-Plugins/blob/master/src/plugins/npc-duplicate.c Install & enable this plugin This script uses a relatively new NPC sprite at the moment of writing this release. 4_BONFIRE Therefore, you may have to edit the Hercules source to allow for this new NPC To the /db/constants.conf add this line: 4_BONFIRE: 10252 In the /src/map/npc.h change this line: #define MAX_NPC_CLASS2_END 10800 This will allow for way more NPCs Save and recompile Hercules. In the client, you may not have this NPC But luckily for you, I've included with this release a data.zip archive containing the NPC sprite and the sound of striking a matchstick. Just add it to your GRF or data folder if you use data folder. In the client, Lua Files make sure you have this NPC sprite LuaFiles514/Lua Files/Datainfo/NPCIdentity.lub JT_4_BONFIRE = 10252, LuaFiles514/Lua Files/Datainfo/jobName.lub [jobtbl.JT_4_BONFIRE] = "4_bonfire", In the /db/re/item_db.conf or /db/pre-re/item_db.conf find Id: 7035 and add these 3 attributes Type: 2 Delay: 3000 Script: <" callfunc("F_CreateCFDup"); "> Configuration: It is a configurable script All of the parameters are explicitly commented for a better understanding of the rules .refillHP_rate = 15; // number of HP to give every refill .refillSP_rate = 5; // number of SP to give every refill .refill_distance = 3; // max distance from fire HP/SP regeneration will work .camp_fire_delay = 5; // Skip how many ticks before feel warm ;) .refill_timer = 300; // wait rand(X) ms before refil Feel free to adjust to your server needs [email protected]_distance = 5; // How far from other NPCs allowed to make fire. [email protected]_duration = 1000 * 60 * 3;// 3 minutes (How long will the Campfire last, in ms) Submitter Habilis Submitted 06/22/18 Category Utility  
  2. HukktoberFest This year was a BLAST, I've learned alotta things about GIT & GitHub!
  3. View File [Event] Wheel of fortune Wheel of fortune Fun event, this particular version is set to accept Zeny as a payment for gambling. Would like to thank a lot @Myriad for Improving my code! Package contains: data.zip data folder to put into your GRF file or straight into data folder. wheel_of_fortune.txt the script itself. WheelOfFortune.psd the Photoshop source file, you can edit the prizes pictures if you like. This event can be configured to run automatically OnClock0800: OnClock1200: OnClock1600: OnClock2000: OnClock2200: just change this part of the script, at what time you want the script to run. Or, a GM can start this event by running this command : @wheel_of_fortune start As a reference, This is a version of the script using event points as a payment (in case you would like to take a look) https://pastebin.com/wN6ZjxM0 Submitter Habilis Submitted 06/14/18 Category Events & Games  
  4. Hello Boys and Gals I decided to do a experiment project, on with how minimal $ input, I could make a decent (by decent, I mean, players wouldn't want to delete the game client after 15 minutes playing) Ragnarok Online server and Comunity I will write it all in the Dev's Diary Format (Every entyr will follow standart : Day X : doing stuff [What I've done]) Day 1: First steps First of all, I needed a server software. After reading few reviews, I considered Hercules as my server software, mainly for it's hardware resources management. Then, I needed hardware. Since this is minimal $ input, I have compiled it and configured it to run on my RaspberryPi 3, which runs already a webserver, OwnCloud. It has an UPS made out of a PowerBank (for those who are curious http://raspi-ups.appspot.com/en/index.jsp) Not and option for you ? - You can spend 150-200$ for a year of VPS - Or, you could dustoff that Intel Core 2 duo that sits in your closet (im sure, for many of you, it does), it will run a server just fine... Need to configure a home network (its actually really easy) all I needed to do is give my server machine - a static ip (good business practice) - To that static IP, I needed to forward ports 3 ragnarok ports, 80/443 (80 if Im planning to host a webserver aswell, 443 if Im planning to use SSL, you know that https:// link... will be explained later in the DevsDiary...) I decided not to host a webserver for my Ragnarok Server Comunity. If the game server is down, I want the web site still be available... no problem go to Google and search for free web hosting, there are many of them just suit myself.... then I went to domain registrar (I used Godaddy) and look for a .com domain for my server .com domain grants some credibility When I have added my .com domain to the cart I went to google and search "cupons domain [site where I buy my domain] (in my case its godaddy)" I got a cupon code for first year registration of .com domain for 99cents Now I needed a website... there is plenty of website designs on these forums I liked : https://rathena.org/board/files/file/3012-erods-unfinished-web-template/ Mainly because it was already HTML, I didn't have to slice PSDs... since, I just want a website with basic info a little design and there you go I've configured the DNS of my .com domain to the free webhosting Now everyone can access my server Website from .com domain So far I've spent 99cents on .com domain... Day 2: Free Hosting Limitations The Idea behind using a freehosting, is to keep site and comunity online during Game server downtime. Sure free hostings limit possibilities. But Im designing a strategy to bypass those limitations in one way or another... 1) Free hostings do not allow open socket (used to check server status Online/Offline) Its actually pretty easy to bypass Free hostings offer Cron (Planified tasks) So I will start writing API-like software to run on the webserver on same machine as RagnarokServer Ragnariok server Machine Free Web Hosting Web-API (like) <--------------------- Cron job every 5 minutes with CURL call to Server machine does open socket on 127.0.0.1 returns Plain Text Or JSON (undecided yet) 111 (1 - map is on 1- login is on 1 - char is on) -------------------------> Builds static HTML file with styling and all that good stuff (if no reply from GameServer, Server considered offline) WebSite just includes that static HTML file using AJAX True, the status is not very accurate, it has 5 minutes update lag. but its fully functionnal, no matter what crazy Limitation my free web hosting impose.... Im also thinking to add a API key concept Much like KeyChain VPN token some company give you to work from home... My strategy is never reveal what my database connection string is.... In case a Hacker gets a webshell on that free site the only thing he will see is the WEB-API adress and API token generation algorithm and SALT. Im also thinking to add logging to API so if API spam or bruting attemps detected, I would just change API token Algorithm...
  5. I learneed everything at school
  6. Version 1.0.0

    158 downloads

    Originally: There is a nice contribution from meko on that subject, Menhir (Big rock that possesses magical powers and able to restore Health and Energy of Seekers resting/meditating nearby) Thanks, meko! But, I thought to myself, well, that is wonderful, but why not make it portable? The Idea: An element of role play, a way to add functionality to the item 7035 - Matchstick, To light a Campfire. A Campfire is a portable temporary regeneration NPC. OW, and it is configurable ;). Campfire to restore / regenerate HP & SP. When you sit by the Campfire, you start feeling the warmth and the comfort, thus your HP & SP begin to regenerate. Mechanics : A phosphorus tipped stick that can be used to start a fire. (Now Indeed ) When you use the item Matchstick in your inventory, it will spawn a duplicate of the NPC called Campfire. This will help you when you are in the field, farming, grinding, starting a Campfire will help you rest. - You need to sit close to the Campfire (3 cells ) to feel the warmth. - Anyone can sit by your Campfire and rest. - Campfire lasts 2-3 minutes. - Need to sit for at least some time to begin feeling the warmth and comfort. - you cannot start a fire within 5 cells of another NPC - If you use a match one more time, old Campfire disappears and a new one appears. I think it will add an element of roleplay and romanticism to the gameplay. Installation : To be able to use this script you need a plugin npc-duplicate.c https://github.com/dastgirp/HPM-Plugins/blob/master/src/plugins/npc-duplicate.c Install & enable this plugin This script uses a relatively new NPC sprite at the moment of writing this release. 4_BONFIRE Therefore, you may have to edit the Hercules source to allow for this new NPC To the /db/constants.conf add this line: 4_BONFIRE: 10252 In the /src/map/npc.h change this line: #define MAX_NPC_CLASS2_END 10800 This will allow for way more NPCs Save and recompile Hercules. In the client, you may not have this NPC But luckily for you, I've included with this release a data.zip archive containing the NPC sprite and the sound of striking a matchstick. Just add it to your GRF or data folder if you use data folder. In the client, Lua Files make sure you have this NPC sprite LuaFiles514/Lua Files/Datainfo/NPCIdentity.lub JT_4_BONFIRE = 10252, LuaFiles514/Lua Files/Datainfo/jobName.lub [jobtbl.JT_4_BONFIRE] = "4_bonfire", In the /db/re/item_db.conf or /db/pre-re/item_db.conf find Id: 7035 and add these 3 attributes Type: 2 Delay: 3000 Script: <" callfunc("F_CreateCFDup"); "> Configuration: It is a configurable script All of the parameters are explicitly commented for a better understanding of the rules .refillHP_rate = 15; // number of HP to give every refill .refillSP_rate = 5; // number of SP to give every refill .refill_distance = 3; // max distance from fire HP/SP regeneration will work .camp_fire_delay = 5; // Skip how many ticks before feel warm ;) .refill_timer = 300; // wait rand(X) ms before refil Feel free to adjust to your server needs [email protected]_distance = 5; // How far from other NPCs allowed to make fire. [email protected]_duration = 1000 * 60 * 3;// 3 minutes (How long will the Campfire last, in ms)
  7. Server very n00b, admin very n00d Good luck! And alotta success bruhh
  8. Habilis is all about CyberSecurity SO, here is an answer of a Hukker Create a SQLView in teh Database https://www.w3schools.com/sql/sql_view.asp example CREATE VIEW vw_ServerStats AS SELECT ... FROM users WHERE ... LEFT JOIN ... ON ... 2 - Create a SQL user herc_Viewer With the grant to select ONLY on vw_ServerStats That way if an Evil Hukker such as Habilis uploads a WebShell to your shitkoded super sophisticated website and sees your connections string for user herc_Viewer and his password. Habilis will not be able (CREATE, EDIT, DELETE) users Habilis will not be able to CREATE mvp cards and sell them for real money (Habilis's favorite) Habilis will not be able to SELECT user info such as Emails and passwords Only thing Habilis will be able to do is to SELECT info already publically available on your website. Beware of Hukkers, and don't forget to download your internet anonymity!
  9. Yes, if you doing it on windows, it can be.
  10. Hello Is there a way for someone who isn't a total Ragnarok Online Nerd (Myself) To control the episode Server wise and Client wise - Npcs - Monsters - Items - Maps - Commands I suppose all of this should be done manually... Is there a guide or a check-list to aid me in that process? For example, according to this episode Timeline: http://herc.ws/board/topic/3554-ragnarok-episode-timeline/ I want to FREEZE it at : 2007.04.10: Episode 11.3 : Nameless Island Right now I'm using 2013 client and latest Hercules. Seems like a lot of work... Would appreciate all available information! Really....
  11. Was looking for a sprite of a big board. found it with a girl standing in front of it... And fixed it a little bit This might be a release if there is a demand for it. I got another Briliant idea, custom FastTravel system just like in modern games. to be able to fast travel to a location, a player needs to discover that location first. Come to the location and do a quest (or pay) on that location to "open it" and this location will appear in the list of locations available for fast travel. There is a very nice NPC already. That I'm going to call FastTravel
  12. I had this issue with campfires and stuff When you dupe you gottta create a unique NPC name ex from my CampFire NPC sprintf("Campfire#CF_%d", getcharid(CHAR_ID_CHAR)) then you can do setd and getd of setd(sprintf("[email protected]_%d", [unique identifier]))
  13. event

    It is an item so these functions be of help to you if(countitem(.RequiredItem_id) >= .RequiredItem_qty) and delitem(.RequiredItem_id, .RequiredItem_qty);
  14. Linux i. Make sure mapcache in plugins in src/plugins/makefile.in ii. Make sure that in conf/plugins.conf "HPMHooking", - is not commented (remove // before) iii. Make plugins 0. Define datafolder in conf/grf-files.txt ex : data_dir: /home/hercuser/Hercules/conf/client_data 1. Add ".gat", ".gnd", ".rsw" files to clients data folder AND /home/hercuser/Hercules/conf/client_data. 2. Edit "mapnametable.txt" and "resnametable.txt" files in clients data folder AND /home/hercuser/Hercules/conf/client_data. 3. Edit "map_index.txt" in db folder. 4. Edit conf/map/maps.conf 5. cache maps ex: ./map-server --load-plugin mapcache --map prontera 6. Add flags/warps/monsters to the map as a script in npc folder For more information you can read a guide written by Myriad
  15. event

    No, sry, this may not be compatible with rAthena. As this script was developed and released for Hercules community.
  16. After the release of the CampFire I decided to make a fishing game. In the official game Client there are already nice fishes released. So, I gathered all 19 of them. And renamed them to English. There is also a very nice NPC sprite in the official Client I borrowed fishing rod sprites from some other server The problem with official fishing rods, is that, they look surprisingly like Whips... http://ratemyserver.net/index.php?iname=fishing+rod&page=re_item_db&quick=1&isearch=Search I made them wearable and double handed. Then, I found the most interactive fishing game script. Unfortunately, this script is written for rAthena and has major logic issues. But, I managed to make it work on Hercules. Work In Progress... Work In Progress... What is the Ide of Fishing game 3 different fishing rods obtainable by quest Wooden, bamboo, metallic fishing rood with different properties modifying the fish catching process Metallic Fishing Rod can be refined (for better modificators) there is also a 1% risk of losing the Fishing Rod on failure Player can catch Junk - Common item such as Empty Bottle, Jeloppy, Fluff, etc. Item - Not common item that can be fished out of the weater Shoes, Boots, Old Blue Box, Etc. Fish - Very Common (One of the Fishes displayed above) Mermaid - Common , WTF moment, Mermaid will cast a Heal or buff on you and disappear. Fish monster - Not Common, Player Fished out of the water an aggressive monster. (Marc, Swordfish) I'm also planning to give Experience. There will be diffirent fishing spots Around prontera - Fishing spots for beginners, require the wooden fishing rod, lake, river fish can be fished there. Alberta / Comodo - Intermediate fishing spots, require Bamboo fishing rod, Ocean, sea fish can be fished there. (Higher chance to fish out fish monster) Izlude Island (Turtle island) - Advanced fishing spots require Metalic fishing rod, Giant, Legendary fish can be fished there.
  17. games

    There is a small problem some clients cant display it if inside a folder inside /illust But works good if directly inside /illust My client won't ex: /illust/hpbar/0.bmp [won't work] ex: /illust/0_hpbar.bmp [Works]
  18. I've recently got a brilliant idea. Why not make my own version of a paid script, sold on rAthena and release it to Hercules for free!? (Not because I'm banned on rAthena ) I need a peer review before releasing the whole package. @Myriad Did a nice Peer review of my terribel kode... If anyone else would like to contribute, feel free. Otherwise, it is soon to be released UPD : I reDrew the cutins, they don't look like stolen from rAthena 1) configuration there are 2 arrays setarray .prize_id[1],-1,31024,31026,31008,31020,31017,31010,31016,0,31009; setarray .prize_qty[1],2,1,1,1,3,3,1,3,0,3; in prize_id if id is > 0, the prize is an item if id = 0 , the prize is NOTHING! if id = -1, the prizer is free spin (number of free spins set in qty array) in array .prize_qty you setup the quantity won //===== Hercules Script ====================================== //= Wheel of Fortune //===== By =================================================== //= Habilis //= Edited by Myriad //===== Description ========================================== //= Wheel of fortune something. //============================================================ - script Wheel_of_Fortune FAKE_NPC ,{ OnInit: disablenpc("Wheel of Fortune#Main"); disablenpc("Hussein#WOF"); .EventName$ = "[Wheel Of Fortune]"; end; OnMinute39: OnStart: query_sql("DELETE FROM `acc_reg_num_db` WHERE `key`='#freewheelfortunespin';"); announce(sprintf("%s : The event will begin in 1 minute, near the center of Prontera.", .EventName$), bc_blue | bc_all); initnpctimer(); end; OnTimer60000: // 1 min enablenpc("Wheel of Fortune#Main"); enablenpc("Hussein#WOF"); announce(sprintf("%s : Come to Prontera and test your luck, everyone got some free spins!", .EventName$), bc_blue | bc_all); end; OnTimer1800000: // 30 mins announce(sprintf("%s : One more minute, do your last spin!", .EventName$), bc_blue | bc_all); end; OnTimer1860000: // 31 mins OnStop: disablenpc("Wheel of Fortune#Main"); disablenpc("Hussein#WOF"); end; } prontera,159,178,3 script Hussein#WOF 1_M_MERCHANT,{ doevent("Wheel of Fortune#Main::OnTalk"); end; } prontera,155,176,3 script Wheel of Fortune#Main 2_SLOT_MACHINE,{ OnTalk: if (#freewheelfortunespin == 0) #freewheelfortunespin = .Free_Spins; if (getd(.Event_Points_Variable$) < .Points_Cost && #freewheelfortunespin < 0) { mesf("[^0055FF ::: %s ::: ^000000]", .EventName$); mes("You are out of points"); mes("and have no more free"); mes("spins! Come back next"); mes("time for more."); close(); } [email protected]$ = (#freewheelfortunespin > 0) ? sprintf(", but you, my friend, have %d free spin%s!", #freewheelfortunespin, (#freewheelfortunespin == 1) ? "" : "s") : "."; cutin("aca_salim02", 2); addtimer(1, sprintf("%s::OnEnd", strnpcinfo(NPC_NAME))); mesf("[^0055FF ::: %s ::: ^000000]", .EventName$); mes("Do you want to spin the wheel?"); mesf("It costs ^FF0000%d Event points^000000 to play%s", .Points_Cost, [email protected]$); next(); callsub(S_Loop); S_Loop: [email protected] = getd(.Event_Points_Variable$); if ([email protected] < .Points_Cost && #freewheelfortunespin < 0) callsub(S_End); switch (select( (#freewheelfortunespin > 0) ? sprintf("Yes! Use free spin! (%d left)", #freewheelfortunespin) : "", ([email protected] > 0) ? sprintf("Yes! Use Event Points. (%d remaining)", [email protected]) : "", "No (Leave)" )) { case 1: callsub(S_Pay, 0); case 2: callsub(S_Pay, 1); default: callsub(S_End); } S_Pay: switch (getarg(0)) { // pay with free spin case 0: if (#freewheelfortunespin > 0) { if ((#freewheelfortunespin -= 1) < 1) #freewheelfortunespin = -1; callsub(S_Gamble); } else callsub(S_End); // Pay with points case 1: default: if (([email protected] = getd(.Event_Points_Variable$)) >= .Points_Cost) { setd(.Event_Points_Variable$, ([email protected] -= .Points_Cost)); dispbottom(sprintf("%s : You now have %d event points.", .ServerName$, [email protected])); callsub(S_Gamble); } else { cutin("aca_salim02", 2); mesf("[^0055FF ::: %s ::: ^000000]", .EventName$); mes("Awww, you don't have enough to gamble..."); mes(" "); mes("Have you ever heard?"); mes("'Money isn't all that matters' Got it?"); mes("Byeeeeeeeeeeeeee ;)"); callsub(S_End); } } S_Gamble: // Actual Gambling [email protected] = rand(.Sector[0], .Sector[1]); [email protected] = ([email protected] * 2) - 1; [email protected] = .Spin_Speed; for ([email protected] = 0; [email protected] < .nbTurns; [email protected]++) { [email protected] = .Cutin[0]; while ([email protected] <= .Cutin[1]) { cutin(sprintf("%s%d", .cutin$, [email protected]), 4); sleep2([email protected]); [email protected]++; [email protected]++; } } [email protected] = .Cutin[0]; while ([email protected] < [email protected]) { cutin(sprintf("%s%d", .cutin$, [email protected]), 4); sleep2([email protected]); [email protected]++; } cutin(sprintf("%s%d", .cutin$, [email protected]), 4); if (.prize_id[[email protected]] == -1) { // Free spin if (.Sound_Effects) soundeffect("wheel_jackpot.wav", 0); announce(sprintf("[%s] : Wow, %d more Free spins!!!", .EventName$, .prize_qty[[email protected]]), bc_blue | bc_self); #freewheelfortunespin = #freewheelfortunespin == -1 ? .prize_qty[[email protected]] : #freewheelfortunespin + .prize_qty[[email protected]]; } else if (.prize_id[[email protected]] == 0) { // nothing if (.Sound_Effects) soundeffect("wheel_lost.wav", 0); announce(sprintf("[%s] : Awwww, No luck in gamble, more luck in love...", .EventName$), bc_blue | bc_self); } else { // item if (.Sound_Effects) soundeffect("wheel_won.wav", 0); announce(sprintf("[%s] : Enjoy your prize!!!", .EventName$), bc_blue | bc_self); getitem(.prize_id[[email protected]], .prize_qty[[email protected]]); } sleep2(1000); callsub(S_Loop); end; S_End: close2(); OnEnd: cutin("", 255); end; OnInit: .ServerName$ = "[Your boring server]"; .EventName$ = "Wheel Of Fortune"; .cutin$ = "WheelOfFortune_"; .Event_Points_Variable$ = "#LROEVENTPOINTS"; // The name of your event points variable setarray(.Sector, 1, 10); // Sector range setarray(.Cutin, 0, 19); // Cutin range .Spin_Speed = 50; // What is the base spin speed? (ms) .nbTurns = 2; .Points_Cost = 100; // How many 'points' does it cost for a spin? .Free_Spins = 1; // How many free spins does a player get? .Sound_Effects = true; // Enable sound effects? (true/false) setarray(.prize_id[1], -1, 31024, 31026, 31008, 31020, 31017, 31010, 31016, 0, 31009); setarray(.prize_qty[1], 2, 1, 1, 1, 3, 3, 1, 3, 0, 3); end; }
  19. Yesterday, after rambles on Discord with Dastgir and Asheraf, I've got another Brilliant Idea for a Release from Habilis! The Idea: Camp Fire to restore / regenerate HP & SP. When you sit by the Camp fire, you start feeling the warmth and the comfort, so your HP & SP begin to regenerate. There is a nice contribution from Meko on that subject Menhir (Big rock that possesses magical powers and able to restore Health and Energy of Seekers) Thanks Meko! So, I thought to myself, well, that is wonderful, but why not make it portable? Because, conveniently, there is this NPC sprite : 4_BONFIREID: 10252 (0x280C) Even more conveniently, there is this item: Matchstick Item ID# 7035 (Matchstick) A phosphorus tipped stick that can be used to start a fire. http://ratemyserver.net/index.php?page=item_db&item_id=7035 Dastgir, suggested using this plugin to make this possible: https://github.com/dastgirp/HPM-Plugins/blob/master/src/plugins/npc-duplicate.c Mechanics : When you use the item Matchstick in your inventory, it will spawn a duplicate of the NPC called Camp Fire. So that when you are in the field, farming, grinding you could rest. - You need to sit close to the Camp Fire (3 cells ) to feel the warmth. - Anyone can sit by your Camp Fire and rest. - Camp Fire lasts 2-3 minutes. - Need to sit for at least 3 seconds to begin feeling the warmth and comfort. - you cannot start a fire within 5 cells of another Camp Fire. - If you use a match one more time, old Camp Fire disappears and a new one appears. I think it will add an element of roleplay and romanticism to the gameplay. (Habilis is a soft, sensitive and romantic type ). Expect the Release sometime soon...
  20. No, you don't need to be root, the user executing this command, needs to have rights on the folder...
  21. put the output of the commands whoami ls -la maps/pre-re/
  22. Hi, Should be Fixed.
  23. Here is the pre-releae version. anyone, who feel like it, can contribute! prt_fild08,138,364,0 script Camp Fire#CF 4_BONFIRE,{ end; OnRefill: getmapxy([email protected]$, [email protected], [email protected], UNITTYPE_PC); getmapxy([email protected]_map$, [email protected]_x, [email protected]_y, UNITTYPE_NPC); if ([email protected]$ != [email protected]_map$ || distance([email protected]_x, [email protected]_y, [email protected], [email protected]) > .refill_distance || !(issit())) { @camp_fire_regen = 0; @camp_fire_tick = 0; end; } if(@camp_fire_regen == 1) { heal(.refillHP_rate, .refillSP_rate); } else { if(@camp_fire_tick >= .camp_fire_delay) { @camp_fire_regen = 1; @camp_fire_tick = 0; dispbottom("You are feeling warm and cozy."); } else { @camp_fire_tick++; } } end; OnTimer500: getmapxy([email protected]_map$, [email protected]_x, [email protected]_y, UNITTYPE_NPC); [email protected] = getunits(BL_PC, [email protected][0], false, [email protected]_map$, ([email protected]_x - .refill_distance), ([email protected]_y - .refill_distance), ([email protected]_x + .refill_distance), ([email protected]_y + .refill_distance)); for ([email protected] = 0; [email protected] < [email protected]; [email protected]) { addtimer(rand(.refill_timer), strnpcinfo(NPC_NAME) + "::OnRefill", [email protected][[email protected]]); } initnpctimer(); end; OnRemoveDup: deltimer(strnpcinfo(NPC_NAME) + "::OnRefill"); stopnpctimer(); duplicateremove(strnpcinfo(NPC_NAME)); end; OnInit: .refillHP_rate = 15; // number of HP to give every refill .refillSP_rate = 5; // number of SP to give every refill .refill_distance = 3; // max distance from fire HP/SP regeneration will work .camp_fire_delay = 5; // Skip how many ticks before feel warm ;) .refill_timer = 300; // wait rand(X) ms before refil initnpctimer(); } function script F_CreateCFDup { [email protected]_distance = 5; // How far from other NPCs allowed to make fire. [email protected]_duration = 60000; //180000; // 3 minutes (How long will the Camp fire last) [email protected]_char_id = getarg(0); attachrid([email protected]_char_id); getmapxy([email protected]$, [email protected], [email protected], UNITTYPE_PC); if(getmapxy([email protected]_mapname$, [email protected]_mapx, [email protected]_mapy, UNITTYPE_NPC, sprintf("Camp Fire#CF_%d",[email protected]_char_id)) == 0) { deltimer(sprintf("Camp Fire#CF_%d::OnRemoveDup", [email protected]_char_id)); duplicateremove(sprintf("Camp Fire#CF_%d", [email protected]_char_id)); } if(getunits(BL_NPC, [email protected][0], false, [email protected]$, ([email protected] - [email protected]_distance),([email protected] - [email protected]_distance), ([email protected] + [email protected]_distance), ([email protected] + [email protected]_distance)) > 0) { dispbottom("A fire cannot be started here."); } else { soundeffect ("strike-matchstick.wav",0); duplicatenpc("Camp Fire#CF", "Camp Fire", sprintf("CF_%d", [email protected]_char_id), [email protected]$, [email protected], [email protected], 0); addtimer([email protected]_duration, sprintf("Camp Fire#CF_%d::OnRemoveDup", [email protected]_char_id)); } return(); } Here is in the intem_db.conf { Id: 7035 AegisName: "Matchstick" Name: "Matchstick" Type: 2 Buy: 100 Weight: 10 BuyingStore: true Delay: 15000 Script: <" callfunc("F_CreateCFDup", getcharid(CHAR_ID_CHAR)); "> }, There is still some work to be done.
  24. The animated fire is a relatively new NPC sprite. I've had a little sprite problem. I will add all the instructions on how to add this sprite if you don't have it (Basically instructions how to add a custom NPC, server side & client side) Note that it says in the chat, You are feeling warm and cozy.