Jump to content

Haziel

Content Moderator
  • Posts

    639
  • Joined

  • Last visited

  • Days Won

    93

Everything posted by Haziel

  1. The Skill Throwing Mastery, also known as Shuriken Training is identified by NJ_TOBIDOUGU. Changing passive bonuses, usually is on src/map/battle.c. Find this line: if (skill_id == NJ_SYURIKEN && (skill = pc_checkskill(sd,NJ_TOBIDOUGU)) > 0) { ATK_ADD(wd.damage, wd.damage2, 3 * skill); Currently, the extra damage given is 3 * Skill Level. Change that 3 according to what you want. Which is something like this. if (skill_id == NJ_SYURIKEN && (skill = pc_checkskill(sd,NJ_TOBIDOUGU)) > 0) { ATK_ADD(wd.damage, wd.damage2, 50 + 5 * skill); Final Damage is 50 + 5 * Skill Level. Then, recompile.
  2. Well, even you don't want to change the langtype, you could change it to test if it's the problem. As far as I could test, it's not. The only thing I had to do is to follow the default names, I mean: <loading> <image>loading00.jpg</image> <image>loading01.jpg</image> <image>loading02.jpg</image> <image>loading03.jpg</image> <image>loading04.jpg</image> <image>loading05.jpg</image> <image>loading06.jpg</image> <image>loading07.jpg</image> <image>loading08.jpg</image> <image>loading09.jpg</image> <image>loading10.jpg</image> </loading> And, like, the first file must be named that way, and on, to work. At least, was how I managed to make it works.
  3. Actually, no, that's the way to do it. But, trust me, It's easier than it appears to be.
  4. Please, provide client date and clientinfo.xml so we can try to help. But, you can test using langtype 0 if anything changes.
  5. Google is your friend: https://rathena.org/wiki/Main_Page
  6. Well, for what you're trying to do, I think a .wav would work better, since it's smaller, and, once you create a function to check if the player is walking, you will not be worried to stop it when it stops to walk. *soundeffect "<effect filename>",<type>; *soundeffectall "<effect filename>",<type>{,"<map name>"}{,<x0>,<y0>,<x1>,<y1>}; These two commands will play a sound effect to either the invoking character only ('soundeffect') or multiple characters ('soundeffectall'). If the running code does not have an object ID (a 'floating' NPC) or is not running from an NPC object at all (an item script) the sound will be centered on the character who's RID got attached to the script, if any. If it does, it will be centered on that object. (an NPC sprite) Effect filename is the filename in a GRF. It must have the .wav extension. It's not quite certain what the 'type' actually does, it is sent to the client directly. It probably determines which directory to play the effect from. It's certain that giving 0 for the number will play sound files from '\data\wav\', but where the other numbers will read from is unclear. The sound files themselves must be in the PCM format, and file names should also have a maximum length of 23 characters including the .wav extension: soundeffect "1234567890123456789.wav", 0; // this will play the soundeffect soundeffect "12345678901234567890.wav", 0; // throw gravity error You can add your own effects this way, naturally. And the map can be checked just before you play the sound, nothing hard to do. The catch here is just to check if the character is walking or no. The last resource is add the sound to the .act of each job sprite, but it woundn't allow the sound to be changed according to the map.
  7. Hum, I dislike the way that script was created, so... function script checkmap { setarray .@maps$[0],"geffen"; // List of Maps set .@map$, getarg(0); set .@count, getarraysize(.@maps$); for(set .@i,0; .@i < .@count; set .@i,.@i+1){ if (.@map$ == .@maps$[.@i]){ return 1; } } return 0; } - script blockdc -1,{ end; OnPCLoadMapEvent: getmapxy .@map$, .@x, .@y, 0; set .@result, callfunc("checkmap", .@map$); if (.@result == 0){ end; } set .@account_id, getcharid(3); set .@query$, "SELECT `last_ip` FROM `login` WHERE `account_id` =" + .@account_id; set .@result, query_sql(.@query$, .@last_ip$); set .@query$, "SELECT DISTINCT `login`.`account_id` FROM `char`,`login` WHERE `login`.`last_ip` = '" + .@last_ip$ + "' AND `char`.`online` = 1"; set .@result, query_sql(.@query$, .@account_id2); set .@count, .@result; if (.@result > 1){ for (set .@i,0; .@i < .@count; set .@i,.@i+1){ if (.@account_id != .@account_id2[.@i]){ if (attachrid(.@account_id2[.@i])){ getmapxy .@map$, .@x, .@y, 0; set .@result, callfunc("checkmap", .@map$); if (.@result == 1){ // Change here what you want the script to do atcommand "@kick "+strcharinfo(0); } detachrid; } } } } } // List of Maps to Load the OnPCLoadMapEvent geffen mapflag loadevent I made it to work on Geffen, when a second Account enters into Geffen and there's already a Account with some IP, the first one will be kicked. Change it the way you like.
  8. The battleflags are all found in the conf/battle/ folder. This one is specifically the client.conf. About your npc (i suggest you to use the [ code ] box function (withe the <> icon) to make it easy so we can help you. So, let's get to it: prontera,170,180,1 script Stylist#custom_stylist 122,{ setarray .@Styles[1], getbattleflag("max_cloth_color"), getbattleflag("max_hair_style"), getbattleflag("max_hair_color"); setarray .@Look[1], LOOK_CLOTHES_COLOR, LOOK_HAIR, LOOK_HAIR_COLOR; set .@s, select(" ~ Cloth color: ~ Hairstyle: ~ Hair color"); set .@Revert, getlook(.@Look[.@s]); set .@Style,1; while(1){ setlook .@Look[.@s], .@Style; message strcharinfo(0)," this is style #"+.@Style+"."; set .@menu$, " ~ Next (^0055FF"+((.@Style!=.@Styles[.@s])?.@Style+1:1)+"^000000): ~ Previous (^0055FF"+((.@Style!=1)?.@Style-1:.@Styles[.@s])+"^000000): ~ Jump to...: ~ Revert to original (^0055FF"+.@Revert+"^000000)"; switch(select(.@menu$)){ case 1: set .@Style, ((.@Style != .@Styles[.@s]) ? .@Style+1 : 1); break; case 2: set .@Style, ((.@Style != 1) ? .@Style-1 : .@Styles[.@s]); break; case 3: message strcharinfo(0),"Choose a style between 1 - "+.@Styles[.@s]+"."; input .@Style,0,.@Styles[.@s]; if (!.@Style) set .@Style, rand(1,.@Styles[.@s]); break; case 4: set .@Style, .@Revert; setlook .@Look[.@s], .@Revert; break; } } } What is defining the max value of each look is this variable: setarray .@Styles[1], getbattleflag("max_cloth_color"), getbattleflag("max_hair_style"), getbattleflag("max_hair_color"); Which is getting the values direct from the previous mentioned .conf file, so you can directly edit it or make an If according with what you want to limit the looks. if (getgmlevel() > 1) setarray .@Styles[1], getbattleflag("max_cloth_color"), getbattleflag("max_hair_style"), getbattleflag("max_hair_color"); else setarray .@Styles[1], 72, 23, 20; In my example, I put a limit based on their GM Level, usually used to differ VIPs from non-VIPs.
  9. Duration fields are used to store data that usually can not be categorized by the default scheme in _db.txt files but is needed to some calculation in the source. By the way, glad it worked.
  10. Well, let's me see. Desperado is not counted as a real 'Multiple Hits' because, as far as I know, it does actually damage in 'Multiple Targets', so, it's correct the 1 on skill_db. This line only defines the Success Rate: case GS_DESPERADO: if (rand()%100 < src->val1) skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; You may comment the If line to get rid of the failure chance. Well, finally, I believe that the number of Targets is defined on the mysterious Duration field on skill_cast_db.txt. 516,0,1000,1000,1000,0,0 You can try change it to different values, but, If I recall correctly, you will get what you want (5 targets) with 400 or 500. 516,0,1000,1000,500,0,0 It's not reeeally untested, but neither totally tested, tell me if you get any progress. It's also possible to make the Skill Level to define that. 516,0,1000,1000,100:100:200:200:300:300:400:400:500:500,0,0 I guess that will make Desperado Lv. 9 or 10 to cast the 5 hits, If I'm correct about all of this (you may also try 400...).
  11. I guess the problem in your Script is the type of the variable. The .@var is a scope one, which means it only lasts for the instance, once you end the conversation with de NPC, it vanishes. A @var will be attached to the player until it logs out. A var will be permanently attached to it. Also, you can use { } to expand a content of an If: if (condition) { do it; and it; }
  12. 1. I'm not sure, but, as far as I know, the website is only opnened once the link is clicked on a message box. 2. The easiest way to do it is by Labels, Labels ------ Within executable script code, some lines can be labels: <label name>: Labels are points of reference in your script, which can be used to route execution with 'goto', 'menu' and 'jump_zero' commands, invoked with 'doevent' and 'donpcevent' commands and are otherwise essential. A label's name may not be longer than 22 characters. (23rd is the ':'.) There is some confusion in the source about whether it's 22, 23 or 24 all over the place, so keeping labels under 22 characters could be wise. It may only contain alphanumeric characters and underscore. In addition to labels you name yourself, there are also some special labels which the script engine will start execution from if a special event happens: OnClock<hour><minute>: OnMinute<minute>: OnHour<hour>: On<weekday><hour><minute>: OnDay<month><day>: This will execute when the server clock hits the specified date or time. Hours and minutes are given in military time. ('0105' will mean 01:05 AM). Weekdays are Sun,Mon,Tue,Wed,Thu,Fri,Sat. Months are 01 to 12, days are 01 to 31. Remember the zero. OnInit: OnInterIfInit: OnInterIfInitOnce: OnInit will execute every time the scripts loading is complete, including when they are reloaded with @reloadscript command. OnInterIfInit will execute when the map server connects to a char server, OnInterIfInitOnce will only execute once and will not execute if the map server reconnects to the char server later. OnAgitStart: OnAgitEnd: OnAgitInit: OnAgitStart2: OnAgitEnd2: OnAgitInit2: OnAgitStart will run whenever the server shifts into WoE mode, whether it is done with @agitstart GM command or with 'AgitStart' script command. OnAgitEnd will do likewise for the end of WoE. OnAgitInit will run when data for all castles and all guilds that hold a castle is received by map-server from the char-server after initial connect. No RID will be attached while any of the above mentioned labels are triggered, so no character or account-based variables will be accessible, until you attach a RID with 'attachrid' (see below). The above also applies to, the last three labels, the only difference is that these labels are used exclusively for WoE SE, and are called independently. OnInstanceInit: This label will be executed when an instance is created and initialized through the 'instance_create' command. It will run again if @reloadscript is used while an instance is in progress. OnTouch: This label will be executed if a trigger area is defined for the NPC object it's in. If it isn't present, the execution will start from the beginning of the NPC code. The RID of the triggering character object will be attached. OnTouch_: Similar to OnTouch, but will only run one instance. Another character is chosen once the triggering character leaves the area. OnTouchNPC: Similar to OnTouch, but will only trigger for monsters. For this case, by using 'getattachedrid' will returns GID (ID that returned when use 'monster'). OnPCLoginEvent: OnPCLogoutEvent: OnPCBaseLvUpEvent: OnPCJobLvUpEvent: It's pretty obvious when these four special labels will be invoked. OnPCDieEvent: This special label triggers when a player dies. The variable 'killerrid' is set to the ID of the killer. OnPCKillEvent: This special label triggers when a player kills another player. The variable 'killedrid' is set to the ID of the player killed. OnNPCKillEvent: This special label triggers when a player kills a monster. The variable 'killedrid' is set to the Class (mob ID) of the monster killed. OnPCLoadMapEvent: This special label triggers when a player steps in a map marked with the 'loadevent' mapflag and attaches its RID. The fact that this label requires a mapflag for it to work is because, otherwise, it'd be server-wide and trigger every time a player would change maps. Imagine the server load with 1,000 players (oh the pain...) OnPCStatCalcEvent: This special label triggers when a player's stats are recalculated, such as when changing stats, equipment, or maps, as well as when logging in, leveling up, and mounting a job mount. This can be used to grant additional item bonuses to certain player groups, for instance. OnWhisperGlobal: This special label triggers when a player whispers the NPC, and will run with the player's RID attached. It can accept up to ten parameters, which will be stored into separate temporary character string variables @whispervar0$ to @whispervar9$. See 'doc/whisper_sys.txt' for further documentation. Only the special labels which are not associated with any script command are listed here. There are other kinds of labels which may be triggered in a similar manner, but they are described with their associated commands. On<label name>: These special labels are used with Mob scripts mostly, and script commands that requires you to point/link a command to a mob or another NPC, giving a label name to start from. The label name can be any of your liking, but must be Example: monster "prontera",123,42,"Poringz0rd",2341,23,"Master::OnThisMobDeath"; amatsu,13,152,4 script Master 767,{ mes "Hi there"; close; OnThisMobDeath: announce "Hey, "+strcharinfo(0)+" just killed a Poringz0rd!",bc_blue|bc_all; end; } Each time you kill one, that announce will appear in blue to everyone. "Global" labels There's a catch with labels and doevent. If you call a label (using doevent) and called label is in NPC that has trigger area, that label must end with "Global" to work globally (i.e. if RID is outside of the trigger area, which usually happens since otherwise there would be no point calling the label with doevent, because OnTouch would do the job). For further reference look for npc_event in npc.c. 3. You may use the Cutin command to get that kind of result: *cutin "<filename>",<position>; This command will display a picture, usually an NPC illustration, also called cutin, for the currently attached client. The position parameter determines the placement of the illustration and takes following values: 0 - bottom left corner 1 - bottom middle 2 - bottom right corner 3 - middle of screen in a movable window with an empty title bar 4 - middle of screen without the window header, but still movable The picture is read from data\texture\유저인터페이스\illust, from both the GRF archive and data folder, and is required to be a bitmap. The file extension .bmp can be omitted. Magenta color (#ff00ff) is considered transparent. There is no limit placed on the size of the illustrations by the client, although loading of large pictures (about 700x700 and larger) causes the client to freeze shortly (lag). Typically the size is about 320x480. New illustrations can be added by just putting the new file into the location above. The client is able to display only one cutin at the same time and each new one will cause the old one to disappear. To delete the currently displayed illustration without displaying a new one, an empty file name and position 255 must be used. // Displays the Comodo Kafra illustration in lower right corner. cutin "kafra_07",2; // Typical way to end a script, which displayed an illustration during a // dialog with a player. mes "See you."; close2; cutin "",255; end;
  13. Lub decompilation is not made by a software, It's manual, made by the ones who have skills to do so. For your luck, you can get the Lua files according to your client date here. I don't want to be rude, but I see a lot of your topics which could be easily solved with a bit of search in the forums, try to search for your answer before opening a topic. I think you want to learn, and just ask for what you want in a million threads will teach you nothing. Good luck.
  14. It's actually a Source Modification, you can check an example of this here, if you, also, want to give bonuses without items, you may try this instead. And remember, the Search Tool is your friend.
  15. The Sky effect is hardcoded in the client, by the way, check This and This.
  16. Question 1: See item_trade.txt, I guess the file is self explanatory. Question 2: Search on Database Forum for how to add custom items, item_db is only the Server-side of the process, you still need to edit your Client-side files.
  17. You're getting the file from kRO .grf, obviously it'll be in Korean, search in the Client forum for English Data.
  18. What defines that feature is the Client date. It's not possible to use the new Hotkey bar without updating the client itself.
  19. Something like this: UPDATE `item_db` SET `equip_script` = '', `unequip_script` = '' WHERE `equip_locations` =1 OR `equip_locations` =256 OR `equip_locations` =512 OR `equip_locations` =257 OR `equip_locations` =513 OR `equip_locations` =768 OR `equip_locations` =769; Will cover all of them.
  20. With the current in-built tools, you can choose only one type of item-bound. And the color of the item names are client-side limitations. It may be possible to expand the bounded-item system, but again, it's a source modification.
  21. With in-built tools, it's quite hardto do this, specifically the graphic part, which is client-side, and, if you don't know yet (consedering your other posts) is something really hard to modify freely. It's a source modification, far more complex than just a Script. You will need to look at the recent implemented Official VIP system and see how it expand the slots, then, store the actual unlocked slots in some kind of variable or SQL table. It's a long way to go and would require some time to be done.
  22. Navigation System is a client-side feature, and, as far as I know, only some strange src modification would allow you to integrate the act of click on map (or npc, or mob) to the 'unitwalk' script command. By the way, you can make a player walk using 'unitwalk/unitwalkto' commands, from a function or NPC. *unitwalk <GID>,<x>,<y>{,"<event label>"}; *unitwalkto <GID>,<Target GID>{,"<event label>"}; This command will tell a <GID> to walk to a position, defined either as a set of coordinates or another object. The command returns a 1 for success and 0 upon failure. If coordinates are passed, the <GID> will walk to the given x,y coordinates on the unit's current map. While there is no way to move across an entire map with 1 command use, this could be used in a loop to move long distances. If an object ID is passed, the initial <GID> will walk to the <Target GID> (similar to walking to attack). This is based on the distance from <GID> to <Target ID>. This command uses a hard walk check, so it will calculate a walk path with obstacles. Sending a bad target ID will result in an error. An optional Event Label can be passed as well which will execute when the <GID> has reached the given coordinates or <Target GID>. Examples: // Makes player walk to the coordinates (150,150). unitwalk getcharid(3),150,150; // Performs a conditional check with the command and reports success or failure to the player. if(unitwalk(getcharid(3),150,150)) dispbottom "Walking you there..."; else dispbottom "That's too far away, man."; // Makes player walk to another character named "WalkToMe". unitwalkto getcharid(3),getcharid(3,"WalkToMe"); It may be possible to create a custom 'On' label which would cast a script after navigation system is used, but, again, it's a Source Modification.
  23. In addition to this, I would suggest you a Custom Skill or modification of the 'Holy Water' skill, so the Priest may create exclusive Buff Scrolls for vending.
  24. Haziel

    Issue

    The 'bind-ip' fields are configured and uncommented in the .conf files?
  25. It's simple, if you're used to cardprefixnametable.txt (located into data.grf, client-side). Get the file and, at it's end, add the lines: 4700#[STR + 01]# 4701#[STR + 02]# 4702#[STR + 03]# 4703#[STR + 04]# 4704#[STR + 05]# 4705#[STR + 06]# 4706#[STR + 07]# 4707#[STR + 08]# 4708#[STR + 09]# 4709#[STR + 10]# 4710#[INT + 01]# 4711#[INT + 02]# 4712#[INT + 03]# 4713#[INT + 04]# 4714#[INT + 05]# 4715#[INT + 06]# 4716#[INT + 07]# 4717#[INT + 08]# 4718#[INT + 09]# 4719#[INT + 10]# 4720#[DEX + 01]# 4721#[DEX + 02]# 4722#[DEX + 03]# 4723#[DEX + 04]# 4724#[DEX + 05]# 4725#[DEX + 06]# 4726#[DEX + 07]# 4727#[DEX + 08]# 4728#[DEX + 09]# 4729#[DEX + 10]# 4730#[AGI + 01]# 4731#[AGI + 02]# 4732#[AGI + 03]# 4733#[AGI + 04]# 4734#[AGI + 05]# 4735#[AGI + 06]# 4736#[AGI + 07]# 4737#[AGI + 08]# 4738#[AGI + 09]# 4739#[AGI + 10]# 4740#[VIT + 01]# 4741#[VIT + 02]# 4742#[VIT + 03]# 4743#[VIT + 04]# 4744#[VIT + 05]# 4745#[VIT + 06]# 4746#[VIT + 07]# 4747#[VIT + 08]# 4748#[VIT + 09]# 4749#[VIT + 10]# 4750#[LUK + 01]# 4751#[LUK + 02]# 4752#[LUK + 03]# 4753#[LUK + 04]# 4754#[LUK + 05]# 4755#[LUK + 06]# 4756#[LUK + 07]# 4757#[LUK + 08]# 4758#[LUK + 09]# 4759#[LUK + 10]# The names may turn Green because usually, Runes doesn't cast Prefix names. And, if I recall correctly, it needs to be in langtype 0 or 1.
×
×
  • Create New...