Jump to content

Tyrfing

Members
  • Posts

    86
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Tyrfing

  1. /////////////////////////////////////////////////////// // ___________ _____.__ // \__ ___/__.__.________/ ____\__| ____ ____ // | | < | |\_ __ \ __\| |/ \ / ___\ // | | \___ | | | \/| | | | | \/ /_/ > // |____| / ____| |__| |__| |__|___| /\___ / // \/ Scripts \//_____/ // //===================================================== // Name: Paid Warper // // Description: // At a cost of items, a player will be warped to a map, // and he may retrieve 1/3 of them by talking to the NPC. // // Customizations: // .currency: set to the Item ID you would like the NPC // to trade for the warps. // // .cost: Amount of .currency item to give for each city. // .equip: Equipment ID to be wearing when claiming items. //===================================================== /////////////////////////////////////////////////////// - script Paid Warper 56,{ function WarpTo; function ClaimCurrency; set .npc_name$, "Paid Warper"; set .currency, 619; setarray .warpable_cities$[0], "Prontera", "Payon", "Morocc"; setarray .cost[0], 3, 3, 3; setarray .equip[0], 2293, 2294, 2295; if (!.initialized) { // Sets .warps$ to the valid warps according to the map the NPC is in for (.@i = 0; .@i < getarraysize(.warpable_cities$); .@i++) { set .warps$, .warps$ + (strtolower(.warpable_cities$[.@i]) == strnpcinfo(4) ? "" : .warpable_cities$[.@i]); if (.@i + 1 != getarraysize(.warpable_cities$)) set .warps$, .warps$ + ":"; } set .initialized, 1; } Begin: mes ""; clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "Hello, " + strcharinfo(0) + "!"; switch (select("Warp:Claim:Cancel")) { case 1: mes "Where would you like to warp to?"; WarpTo(select(.warps$)); case 2: clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "You have accumulated so far:"; for (.@i = 0; .@i < getarraysize(.warpable_cities$); .@i++) { mes .warpable_cities$[.@i] + ": " + warp_accumulator[.@i] + " " + getitemname(.currency); } mes "Which would you like to claim?"; ClaimCurrency(select(implode(.warpable_cities$, ":"))); } end; function WarpTo { set .@city, getarg(0) - 1; mes "To warp to " + .warpable_cities$[.@city] + ", you need to provide "+ .cost[.@city] +" "+ getitemname(.currency) + "."; mes "Is that okay?"; if (select("Yes:No") == 1) { if (countitem(.currency) < .cost[.@city]) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "I am sorry, you need " + .cost[.@city] + " " + getitemname(.currency) + " to warp, but you only have " + countitem(.currency) + "."; next; goto Begin; } delitem .currency,.cost[.@city]; warp_accumulator[.@city]++; atcommand "@go " + .warpable_cities$[.@city]; next; } goto Begin; return; } function ClaimCurrency { set .@city, getarg(0) - 1; set .@necessary_equip, .equip[.@city]; if (warp_accumulator[.@city] == 0) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "You don't have any "+ getitemname(.currency) +"s to retrieve."; next; } else if(isequipped(.@necessary_equip)) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "Here you are!"; getitem .currency,warp_accumulator[.@city]; warp_accumulator[.@city] = 0; next; } else { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "I'm sorry, you need to be wearing " + getitemname(.@necessary_equip) + " to retrieve your items."; next; } goto Begin; return; } } prontera,163,184,4 duplicate(Paid Warper) Paid Warper#prt 56 payon,177,104,4 duplicate(Paid Warper) Paid Warper#pay 56 morocc,152,97,4 duplicate(Paid Warper) Paid Warper#moc 56 Try this one. Also, are you using the most current rAthena rev.?
  2. // Base ASPD for each weapon on each job db/re/job_db1.txt (Renewal) db/pre-re/job_db1.txt (Pre-Renewal) // Bonus stats for each job db/job_db2.txt
  3. Here you go: /////////////////////////////////////////////////////// // ___________ _____.__ // \__ ___/__.__.________/ ____\__| ____ ____ // | | < | |\_ __ \ __\| |/ \ / ___\ // | | \___ | | | \/| | | | | \/ /_/ > // |____| / ____| |__| |__| |__|___| /\___ / // \/ Scripts \//_____/ // //===================================================== // Name: Paid Warper // // Description: // At a cost of items, a player will be warped to a map, // and he may retrieve 1/3 of them by talking to the NPC. // // Customizations: // .currency: set to the Item ID you would like the NPC // to trade for the warps. // // .cost: Amount of .currency item to give for each city. // .equip: Equipment ID to be wearing when claiming items. //===================================================== /////////////////////////////////////////////////////// - script Paid Warper 56,{ function WarpTo; function ClaimCurrency; set .npc_name$, "Paid Warper"; set .currency, 619; setarray .warpable_cities$[0], "Prontera", "Payon", "Morocc"; setarray .cost[0], 3, 3, 3; setarray .equip[0], 2293, 2294, 2295; if (!.initialized) { // Sets .warps$ to the valid warps according to the map the NPC is in for (.@i = 0; .@i < getarraysize(.warpable_cities$); .@i++) { set .warps$, .warps$ + (strtolower(.warpable_cities$[.@i]) == strnpcinfo(4) ? "" : .warpable_cities$[.@i]); if (.@i + 1 != getarraysize(.warpable_cities$)) set .warps$, .warps$ + ":"; } set .initialized, 1; } Begin: clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "Hello, " + strcharinfo(0) + "!"; switch (select("Warp:Claim:Cancel")) { case 1: mes "Where would you like to warp to?"; WarpTo(select(.warps$)); case 2: clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "You have accumulated so far:"; for (.@i = 0; .@i < getarraysize(.warpable_cities$); .@i++) { mes .warpable_cities$[.@i] + ": " + warp_accumulator[.@i] + " " + getitemname(.currency); } mes "Which would you like to claim?"; ClaimCurrency(select(implode(.warpable_cities$, ":"))); } end; function WarpTo { set .@city, getarg(0) - 1; mes "To warp to " + .warpable_cities$[.@city] + ", you need to provide "+ .cost[.@city] +" "+ getitemname(.currency) + "."; mes "Is that okay?"; if (select("Yes:No") == 1) { if (countitem(.currency) < .cost[.@city]) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "I am sorry, you need " + .cost[.@city] + " " + getitemname(.currency) + " to warp, but you only have " + countitem(.currency) + "."; next; goto Begin; } delitem .currency,.cost[.@city]; warp_accumulator[.@city]++; atcommand "@go " + .warpable_cities$[.@city]; next; } goto Begin; return; } function ClaimCurrency { set .@city, getarg(0) - 1; set .@necessary_equip, .equip[.@city]; if (warp_accumulator[.@city] == 0) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "You don't have any "+ getitemname(.currency) +"s to retrieve."; next; } else if(isequipped(.@necessary_equip)) { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "Here you are!"; getitem .currency,warp_accumulator[.@city]; warp_accumulator[.@city] = 0; next; } else { clear; mes "[^00cc00"+ .npc_name$ +"^000000]"; mes "I'm sorry, you need to be wearing " + getitemname(.@necessary_equip) + " to retrieve your items."; next; } goto Begin; return; } } prontera,163,184,4 duplicate(Paid Warper) Paid Warper#prt 56 payon,177,104,4 duplicate(Paid Warper) Paid Warper#pay 56 morocc,152,97,4 duplicate(Paid Warper) Paid Warper#moc 56
  4. Seu desejo é uma ordem! /////////////////////////////////////////////////////// // ___________ _____.__ // \__ ___/__.__.________/ ____\__| ____ ____ // | | < | |\_ __ \ __\| |/ \ / ___\ // | | \___ | | | \/| | | | | \/ /_/ > // |____| / ____| |__| |__| |__|___| /\___ / // \/ Scripts \//_____/ // //===================================================== // Name: Poring Reporter // // Description: // A poring reporter will spread the news about your // server walking randomly throughout Prontera. // // Instructions: // Toggle walking by whispering to NPC! // (To whisper the NPC, simply send a private message // in Ragnarok to "npc:Poring Reporter") // Say "walk" and it'll start walking. // Anything else and it'll stop as soon as possible. //===================================================== /////////////////////////////////////////////////////// prontera,147,190,5 script Poring Reporter 909,{ set .@gm_level, 99; // Necessary GM Level set .@npc_name$, "Poring Reporter"; function NewsList; Begin: if (getgmlevel() < .@gm_level) end; npcstop; if (.walking != 0) npctalk "Stopped walking. Tell me to \"walk\".", "", bc_self; set .walking, 0; clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; mes "Hello, master! What are the news today?"; menu "Show news",ShowNews, "Remove news",RemoveNews, "Register news",RegisterNews; ShowNews: clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; if (getarraysize(.news$) > 0) { mes "These are the news:"; NewsList; } else { mes "There are no news."; } next; goto Begin; RemoveNews: clear; NewsList; mes "Enter the number of the new you want to remove:"; input .@remove; clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; mes "Do you want to remove \"" + .news$[.@remove-1] + "\"?"; if (select("Yes:No") == 1) { .@arrsize = getarraysize(.news$); for (.@i = .@remove-1; .@i < .@arrsize; .@i++) { set .news$[.@i], .news$[.@i+1]; } set .news$[.@arrsize], ""; } goto Begin; RegisterNews: clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; mes "What should I spread throughout Prontera?"; input .@new$; clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; mes "\"" + .@new$ + "\""; mes "Is that right?"; if (select("Yes:No") == 2) goto RegisterNews; set .news$[getarraysize(.news$)], .@new$; clear; mes "[ ^f442a7"+ .@npc_name$ +"^000000 ]"; mes "Okay!~"; next; goto Begin; function NewsList { for (.@i = 0; .@i < getarraysize(.news$); .@i++) { if (.news$[.@i] != "") mes (.@i+1) + ". \""+ .news$[.@i] +"\""; } } OnWhisperGlobal: if (getgmlevel() < .@gm_level) end; if (@whispervar0$ == "walk") { set .walking, 1; } else { set .walking, 0; } while (.walking == 1) { set .@posxmin, 142; set .@posxmax, 192; set .@posymin, 189; set .@posymax, 217; npcwalkto rand(.@posxmin, .@posxmax), rand(.@posymin, .@posymax); npctalk .news$[rand(getarraysize(.news$))]; sleep 5000; } end; } Para que o poring ande pelo mapa, é necessário ativá-lo enviando uma mensagem para o npc. Para fazer isso, no lugar onde você coloca o nome dos jogadores com quem deseja ter uma conversa privada, coloque o seguinte: "npc:Poring Reporter". Se você mandar a mensagem "walk", ele vai começar a andar ao redor da parte central de Prontera. Você pode alterar as coordenadas mínimas e máximas.
  5. I don't know what might be the cause of your issues, but I would strongly advise that you discover the version of the emulator you are using on your server. Then, you can simply get the same version from the rAthena repository and diff the .conf and source files to check what settings have been changed, because the infinite defense (that's the name of the feature that causes plants and mushrooms to take 1 as damage) is obviously working on the fresh emulator. It's not a difficult thing to solve.
  6. Tyrfing

    R > LOGO

    My main computer is not working so I'm having to use a very low spec laptop and am currently unable to fulfill your request. If nobody fills it until I fix it, I'll take it once again. I'm sorry for the inconvenience. Tyrfing
  7. Gangsi is an expanded 1-1 job specialized in the capturing and training of pets. It was supposed to have the appearance similar to that of a Munak, and the job would have skills that allowed to turn into a Munak or a Bongun. The 2-1 and 2-2 jobs relative to Gangsi would be Death Knight and Dark Collector, respectively. The first, a warrior, whereas the second a black magic, mind controlling job. I first heard of these jobs in around 2009, but they were dropped in kRO. As to why there are duplicate 3rd jobs, I can't tell. What I know is that the Regular 3rd jobs lack several 2nd job skills.
  8. Find your Language ID on this page. For example, the Language ID for Brazil is 0x0416. Copy it. Go to Google, and paste "0x0416 in decimal" (without quotes, replace my code for yours). Google will display the result in the calculator: 1046. Go your Thor Patcher folder, and open the Configuration folder. Open the Languages folder. Create a new file, with your language name in plain English (for example: Portuguese.ini). Open the LanguageMap.ini file. Add a new line: lid1046='Portuguese.ini' Change the lid number to match with the one you got from Google. Change the file name to match yours. Copy and paste the contents of Default.ini inside the file you created (In this case, Portuguese.ini). Translate each line to your own language. Open Thor.exe (it must be in the same directory as the config.ini, the LanguageMap.ini and the Languages folder).
  9. Ah, yes. I had misunderstood some of the formal requisites. I have just totally rewritten the code. ? Check it out on my first reply to this topic.
  10. I use a permanent variable attached to the character (maxlvlreward) to store whether he already received the reward, and an NPC variable to store the rewards set by the GM. I could change this NPC variable to a permanent global variable in order to keep the rewards set by the GM across server restarts and NPC reloads. I suppose that is what you're talking about. I see that in your script and on pajodex's you use a permanent global variable to hold the amount of players that have reached the maximum level.
  11. I do not know the solution, but do you by any chance use a 4k monitor or a high dpi monitor?
  12. You'll also need to rebase the solution for Windows 10. Once you have installed Visual Studio Community and the additional packages for C++ development, you'll open your rAthena.sln on Visual Studio and right clicking it on your Solution Manager, you'll choose "Rebase Solution". A new window will show up, just hit ok and you're good to go.
  13. Greetings Christopher, I have just downloaded a brand new copy of the emulator and compiled it; the only setting I changed was in src/config/renewal.h to enable pre-RE instead of renewal. The plants and mushrooms are taking 1 as hit. Please provide information on what GIT version of the emulator you are compiling.
  14. Good. If you have any additional questions, please let me know.
  15. prontera,147,175,5 script Vip Giver 52,{ OnInit: hideonnpc "Vip Giver"; OnPCLoginEvent: if (#freeviptime == 0) { vip_time 60*24*7, strcharinfo(0); set #freeviptime,1; } end; } As TheDerpySupport said, it's pretty straightforward.
  16. O primeiro erro "Unfinished string near..." indica um erro de sintaxe no arquivo iteminfo.lub. Verifique se não se esqueceu de alguma aspas duplas ou vírgula em cada termo. Verifique, ainda, se não tem nenhuma vírgula ou aspas duplas em excesso. Verifique também se a codificação de caracteres com a qual está salvando o arquivo está correta.
  17. I'm sorry, I made a mistake. Here you go, please upvote my post. /////////////////////////////////////////////////////// // ___________ _____.__ // \__ ___/__.__.________/ ____\__| ____ ____ // | | < | |\_ __ \ __\| |/ \ / ___\ // | | \___ | | | \/| | | | | \/ /_/ > // |____| / ____| |__| |__| |__|___| /\___ / // \/ Scripts \//_____/ // //===================================================== // Name: Race to Max Level // // Description: // This NPC allows for Game Masters to set a reward to // be given to the first player of each 2nd class that // reaches maximum level (base and class). //===================================================== /////////////////////////////////////////////////////// prontera,147,180,5 script Race to Max Level 58,{ set .@gm_level, 99; // GM level required to set the reward set .@maxbase, 99; set .@maxjob, 50; set .@defaultreward, 510; setarray .@rewardablejobs[0], Job_Knight, Job_Alchemist, Job_Assassin, Job_Bard, Job_Blacksmith, Job_Crusader, Job_Dancer, Job_Hunter, Job_Monk, Job_Priest, Job_Rogue, Job_Sage, Job_Wizard; Begin: clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Hello, " + ((getgmlevel() >= .@gm_level) ? "master! What do you want to do today?" : "are you here for your reward?"); switch(select(((getgmlevel() >= .@gm_level) ? "Set Reward:Restart Race" : ":") + ":YES!:...Reward?:Who was rewarded?:Cancel")) { case 1: goto SetReward; case 2: goto RestartRace; case 3: goto GetReward; case 4: goto ExplainRace; case 5: goto ShowRewarded; default: end; } SetReward: clear; mes "[ ^0099ccRace to Max Level^000000 ]"; if ($reward == 0) set $reward, .@defaultreward; mes "The reward is " + getitemname($reward) + " (ID: " + $reward + ")."; mes "Do you want to change it?"; if (select("Yes:No") == 1) { clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Please enter the new reward item ID."; input .@rewardid; clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Set " + getitemname(.@rewardid) + " as the reward?"; if(select("Yes:No") == 1) { set $reward, .@rewardid; } } goto Begin; RestartRace: clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Are you sure you want to restart the race?"; if (select("Yes:No") == 1) { for (.@i = 0; .@i < getarraysize(.@rewardablejobs); .@i++) { set $rewarded$[.@rewardablejobs[.@i]], ""; } announce "The Race to Max Level has begun! Claim a reward once you reach " + .@maxbase + " base and " + .@maxjob + " class!", bc_all; } goto Begin; GetReward: mes "Let's see... " + strcharinfo(0) + ", huh?"; set .@competitioner, 0; for (.@i = 0; .@i < getarraysize(.@rewardablejobs); .@i++) { if (Class == .@rewardablejobs[.@i]) { set .@competitioner, 1; if (BaseLevel < .@maxbase || JobLevel < .@maxjob) { mes "I'm sorry, but you still need to level a bit more."; } else if ($rewarded$[Class] == strcharinfo(0)) { mes "You have already claimed your reward."; } else if ($rewarded$[Class] != "") { mes "Too late!"; mes "The reward for " + jobname(Class) + " was already claimed by " + $rewarded$[Class] + "."; } else goto GiveReward; } } if (.@competitioner == 0) mes "You need to change your job."; close; GiveReward: set $rewarded$[Class], strcharinfo(0); clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Congratulations! You were the first " + jobname(Class) + " to reach " + .@maxbase + " base and " + .@maxjob + " class!"; getitem $reward, 1; announce strcharinfo(0) + " (" + jobname(Class) + ") reached Max. Level and received " + getitemname($reward) + "!", bc_all; close; ExplainRace: clear; mes "[ ^0099ccRace to Max Level^000000 ]"; mes "Yes! When you reach the maximum level for your class, talk to me and you'll be rewarded with a special item."; next; goto Begin; ShowRewarded: clear; mes "[ ^0099ccRace to Max Level^000000 ]"; for (.@i = 0; .@i < getarraysize(.@rewardablejobs); .@i++) { mes jobname(.@rewardablejobs[.@i]) + ": " + (($rewarded$[.@rewardablejobs[.@i]] != "") ? $rewarded$[.@rewardablejobs[.@i]] : "^ff0000Nobody^000000"); } next; goto Begin; } You can change the maxbase and maxjob variables to match your server configuration, as well as define the minimum GM level to set the rewards on the NPC by changing gm_level variable.
  18. Greetings GaugePower, It looks like your emulator was compiled with a PACKETVER different to that of the client you're using. By default, rAthena is as of now compiling with PACKETVER 20150411. This is defined in src/config/packets.h, but it may be overriden by another define in src/custom/defines_pre.h. So, first open src/custom/defines_pre.h and check whether there's any line in the format: #define PACKETVER YYYYMMDD If so, then this is the PACKETVER you compiled your emulator with, so either change it to match with your client version, or use another client with this version. However, if there is no such line, then the PACKETVER is that defined in src/config/packets.h (20150411). If you decide to use another client, please do not edit src/config/packets.h. Instead, add the define in src/custom/defines_pre.h. Then, recompile. If you provide more information on what client you are using NEMO with, that may be of help. Tyrfing
  19. Tyrfing

    R > LOGO

    Dimensions (in pixels), color scheme and any images you'd like to have on your logo?
  20. Skill duration: To set status bonuses, you have to change the corresponding function in status.cpp (status_calc_agi, status_calc_str, status_calc_dex, status_calc_int, status_calc_vit, status_calc_luk).
  21. This topic is just another instance of the same problem portrayed by you here. Except for the fact that, upon equipping an item, your client automatically sets the sprite for that equipment, @changelook and equipment locations (those you can view in Alt+Q) have nothing to do with each other. @changelook simply makes the server tell the client (your client if you call it with @changelook or another player's client if you call it with #changelook "Player Name") to change the sprite of a specific character position to that of a specified equipment/costume item. This said, your problem is not about creating new equipment locations in Alt+Q, but rather about implementing the necessary client modifications to support displaying additional sprites in desired character positions, so that they can overlap. This is not a simple thing to do; it's practically impossible, to be honest.
  22. I have answered this question in the Portuguese Forums, but I'll write my reply here in English for documentation and guiding purposes. The @changelook command does not really equip an item in any equipment slot, whether in the equipments tab or in the costume items tab; it simply orders the client to change the sprite it's displaying in a specific character position to that of a specified item id. This means that it doesn't matter whether the item is an equipment or a costume item: if they belong to the same position (e.g. middle headgear), @changelook will tell the client to change the sprite at the specified region. @changelook doesn't even know whether the item is LOC 2048 (costume middle headgear) or 512 (middle headgear). When you use @changelook, the clif_changelook (clif.cpp) function is called (it only knows the equipment location in a simplified way, making no distinction between equipments or costume items, and the id of the item whose sprite must be applied). This function, then sends a packet to the client (the player) telling it to change the sprite corresponding to the specified position. The client program (the hexed/diffed client) receives this packet and interprets it on its own way. Therefore, it would be necessary to modify the client so that it could distinguish situations in which it must erase the previous sprite before displaying a new one and the situations on which it mustn't do that. It's a lot of work, and although it'd be relatively straightforward to implement the necessary modifications in the source, implementing the necessary modifications in the client would be a lot more difficult.
  23. Exatamente. O comando @changelook não equipa item em nenhuma posição do Alt+Q, ele simplesmente ordena ao cliente para que altere a sprite exibida em uma determinada posição do personagem. Isso quer dizer que tanto faz se o item é um equipamento normal ou um item visual, se eles ocuparem a mesma posição o @changelook vai modificar a sprite daquela região. Como disse Zell, o @changelook nem sequer sabe se o item tem LOC 2048 ou 512. Quando você executa o comando @changelook, a função clif_changelook (clif.cpp) é executada (ela só sabe a posição do personagem que será modificada e a id do item cuja sprite deve ser aplicada). Essa função, por sua vez envia para o cliente (o player) a ordem para que altere a sprite correspondente à posição especificada. O programa do cliente (o hexed) recebe o pacote e interpreta essa ordem como bem entende. Dessa forma, seria necessário modificar o hexed para que ele soubesse distinguir as situações em que deve apagar a sprite anterior antes de exibir uma nova sprite e as situações em que não deve fazer isso. É um trabalho imenso, e seria necessário modificar tanto a source quanto o cliente.
  24. Deixe-me entender isso direito: você deseja exibir as duas sprites, tanto do equipamento quanto do item visual, ambos da mesma posição, ao mesmo tempo?
  25. In order to compile rAthena, you need not only install Visual Studio, but also the tools for development with C++, which you seem to be missing.
×
×
  • Create New...