Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 01/12/12 in Posts

  1. Toasty's WoE Controller So...once upon a time when I did have a server to run and one of the few questions that would always come up was..."What time was WoE and what region was it?" (WoE on this server was broken up into regions). Usually I didn't know the answer and so I had to go through the awful task of trying to find it in the forums and eventually I just directed everyone to it. And then there's the issue with people not understanding timezones or knowing how to substract. Soo...one day i got off my lazy ass and wrote this little thingymabob that would tell people exactly how long left it is till WoE, where it was and other random tiddy-bits of info. Worked pretty well. Anyways...just recently I was pretty bored and decided to clean it up abit and thought...well...since it's already keeping time..why not just let it do all the agit_controller stuff too. So I added that and presto!....this came out." Features: WoE 2.0 ready Novice WoE ready Real-time updated time display of how much longer till WoE starts/ends WoE configurable on a Castle level basis Useful castle owner listing feature Even more useful region map warper feature Some random skip/start/end WoE functions for GMs Auto-Restart WoE after server crash Now with a mildly easy to use online generator script. Though tested on trunk, will very much likely work on stable (provided you tick the correct box while generating the script) Description: Basically what you get is a little banner NPC with a chatroom on it who's title updates with the amount of time left till WoE starts or ends. (Little idea stolen from one of annie's scripts =P...some mvp arena i think) Clicking on the NPC (the npc not the chatroom) opens up a menu with a couple useful options which are self-explanatory. Note: Castle Owner listing is only for castles of the current/upcoming WoE session. Too much spam to print all Scripts: ver 1.22 - 26-05-2011 (r14829 trunk) (Mirror) (Mirror) ver 1.21 - 21-12-2010 (r14413 trunk) ver 1.20 - 18-10-2010 (r14413 trunk) ver 1.11 - 25-01-2009 (r13435 trunk) ver 1.10 - 03-01-2009 (r13405 trunk) ver 1.02 - 09-10-2008 (r13271 trunk) ver 1.01 - 21-09-2008 (r13091 trunk) ver 1.00 - 10-09-2008 (r13091 trunk) Backup ver1.22 Installation: Generate the script by inputting the times you require and any options you may want in the generator form Install the script as you would for any NPC. Depending if you want to use this to replace agit_controller.txt or not you can replace the contains of ./npc/guild/agit_controller.txt with this script. IF you use this script to manage your WoE timings (which you prob would..). Remove any existing WoE timing management scripts. By default... ./npc/guild/agit_controller.txt -if you didn't replace it with this script ./npc/guild2/agit_start_se.txt -for woe2 controller If you want to use any of the Novice castles make sure you enable them in ./npc/scripts_athena.conf npc: npc/events/nguild/nguild_dunsw.txt npc: npc/events/nguild/nguild_treas.txt npc: npc/events/nguild/nguild_guardians.txt npc: npc/events/nguild/nguild_warper.txt npc: npc/events/nguild/nguild_ev_agit.txt npc: npc/events/nguild/nguild_flags.txt npc: npc/events/nguild/nguild_managers.txt npc: npc/events/nguild/nguild_kafras.txt Restart/Startup server...enjoy =D Limitations: Since WoE can be run in pretty much any format, it's kinda impossible for this script to accommodate for all types of WoE. Anyways...here are the limitations of this script. WoE sessions have to start and end on the same day (usually the case but good to state) Only one WoE session is available at a time. In order to start another one, you must end the current one. The generator will complain if you try to overlap sessions. Standard array/variable limits. 128 for number of WoE sessions and separate regions. 31 different castles per region(Not that anyone is gonna use all that...unless they're planning like an all world WoE extravaganza). Time is actually updated using an infinite loop. Depending on the refresh rate setting timing can be off sync with the time WoE actually starts/end (default 500ms/half a second. This isn't a problem if you are using the built in controller) Due to the way in which the original WoE scripts were coded and how I implemented the castle based controller (calls OnAgitEnd/2 events) castles MAY remain open if they do not have an owner. Notes: Yup...idea for timer based waitingroom was stolen from annie's Mvp Ladder script This script is semi-protected against @reloadscript/@loadnpc commands. Though not recommended that you load the script using this manner, if you must after loading the scripts, to restart the script click each NPC (one NPC only needs to start to initialise the floating main script that controls the WoE timing, but each banner NPC needs to be clicked to start the waitingroom) When doing the timings, it is VERY IMPORTANT that you have the times in order from sunday to saturday and starting time. If you don't do this it'll skip over them till the next week. WoE happens in the order that the timings are specified. Sometimes it may be desirable to have them out of order so it can do one region this week and another one a different week...But this is only a side-effect to the timing design and weird things might happen..so do it at your own risk. (This is no longer a problem in ver 1.10 provided you didn't mess with the config after generating the script) You can change the rate at which the banner is updated by modifying the ".banner_refresh_rate" value in the CONFIG section. The banner will update every '.banner_refresh_rate' seconds. This script is rather dynamic and so adding additional castles just involves modifying and adding arrays. Adding castles to existing regions should be self-explanatory. But setting up a new region...maybe not.. Steps to setup a new region are as follows: Make up a prefix for the region you are adding (in this example I am using "test" Put all the maps for the castles in an array named ".castles_***" (eg. .castles_test$) Put all the put all the woe ending function addresses into an array named "woe_kill_***" (eg. .woe_kill_test$) Go to the constants section in the script (search for CONSTANTS START) Add the castles and portals in the corresponding sections Add the prefix to the end of the array .regions$, the name of the region in .region_names$ and the map that contains all the castle entrances in the array .region_maps$ Tah da!! you have now added a new region. Feel free to test the hell out of this and report bugs/suggestions/criticism. This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License
    2 points
  2. Ninguno habla con criterio, siento decirlo. En primer lugar, rAthena no necesita de publicidad, pero el host no sale "gratis". Dos de los administradores ofrecen sus propios hosts para esto. La propia licencia del foro fue donada por mi, y algunos de los sistemas implementados, como nexus y descargas, pagadas por la administración. Si rAthena no depende de publicidad es por esto, pero no sale gratis, eso desde luego. Si solo hubiera un administrador y estuviera en línea por años, te aseguro que buscar formas de financiación se hace necesario. En muy pocas ocasiones DivineRO ha pedido donaciones para seguir adelante, se ha valido por sí misma mediante planes de publicidad, y eso es un esfuerzo que respeto. El día que rAthena deje de tener el apoyo de sus principales soportes, ¿que ocurre? que cierra. Es así de simple, el trabajo de conseguir contratos de publicidad no es algo malo, sino que incluso llega a ser una tarea apreciable. Desde el punto de vista de un moderador, tengo más confianza en la estabilidad de DivineRO que en la de rA, porque un solo administrador ha conseguido mantener esa comunidad en línea por años. En eA, durante muchos años, deltaanime nos ha hecho el favor. Esta comunidad todavía no ha tenido que pasar por lo que ha pasado DivineRO, así que no veo que algunas criticas que se han realizado aquí tengan sentido. Por otro lado, me frustra que se diga que las guías están desactualizadas. En el aspecto gráfico que es de lo que mejor estoy informado, DivineRO es la comunidad de RO que mejores y más guías tienen en lo referente a diseño en RO, y a día de hoy sigue manteniendose en ese puesto. Por último, DivineRO es algo más que un foro. No juzgueis el tráfico de esa web observando únicamente el tráfico que hay en el foro.
    2 points
  3. Que gracioso. El dinero no sale de los arboles, pero se que mucho menos de argumentos tan injustificados como el que tratas de defender. Creo que olvidaste que estas posteando en un Foro donde la gran mayoria, hemos tenido nuestros servidores y sabemos lo que es pagar un host dedicado. Y para tu información, para el trafico que tiene DivineRO, no se necesita ni un dedicado, a lo mucho una box de uno compartida. Que no saldrian mas de 10 o 20 dolares al mes. Eso y aparte las ganancias por publicidad ES MISERA. La mejor que podriamos decir es google ads para el trafico de divine RO no daria ni 5 dolares al mes. ¿Y que de los servidores de RO privados que pagan publicidad? Yo hago enfasis de la publicidad por cosas como "TRIVIA", "BUSCAS AMOR" y "CASINO ONLINE" que nada que ver con el sitio. La otra, que es de servidores va perfectamente y no me quejo de esta... y se que esos servers pagarian al menos 5$ mensuales. * 5 slots (minimo) = 25 dolares, que sobran y ajustan para un VPS perfectamente. Ajá, eso hablando de publicidad. Pero y que de la facebook bar, los botones de Face y Twitter? que acaso Facebook tambien le paga el host a DivineRO? ... eh no. Es simplemente mala forma de hacer de su web (que no es mala) impresentable tratando de meter, hasta la ultima cosa que se les ocurre, y lo unico que logran es que se vuelve muy confuso. Si divineRO no tuviera esas cosas, seria perfecto. Mas aun asi como esta, va bien. Pero no vamos a decir que es perfecto, pues pierde profesionalismo al permitir tantas cosas. Imaginense ustedes como seria rAthena si se viera igual... por decir una comparacion.
    2 points
  4. Part 1: Not very effective against bots. They can 'click' NPCs alot better than humans. Part 2: Thats not a bad way of doing it but not 100% effective. One way possible to prevent self farming is to force all the people with the same IP on to the same team. This way they have no possible way to fight against themselves but also if it's actually some folks playing at a net cafe or at a lan you're not preventing them from playing the game.
    2 points
  5. E - Script Collection Last Update : September 10, 2013 Refine Function SQL Mission Board Monster Marching Vendor Control Advanced Stylist Coin Exchanger Doppelganger Race Of The Day Limited Items Multi Currency Shop Random News GM Online List Link Broken E-Inquiry DotA Runes Flower Counting Game Class Restriction Chain Quest Build Manager Misc Scripts : Freebies Script Card Trader Gold Room [ Pick Gold ] Gold Room [ Guild Tax ] Map Restriction [ GM Based ] Daily Reward Monthly Reward Monster Spawner Monster Summoner with Last Summoned Display Players Stats & Equipments 3rd Job Item Giver Exchanger [ Cashpoint to Coins ] Exchanger [ Poring Coin - Zeny ] Exchanger [ Points to Tickets ] Exchanger [ Item to Item ] Exchanger [ Item to Item ] Exchanger [ Multi Item to 1 Item ] Party Match Auto Ban Over Stats Users Soul Link Buff Kill Players gain Cash Points Party Members All Get Items [ Snippet ] Message Board Stalker Class Skill Reproduce NPC Multiple Selection Quest [ Template ] In-Game Item Rewarder In-Game Points Rewarder Invasion Event Custom Item Rate Status Point Seller [ Snippet ] Anti Bot Security Script Anti Bot Script [ Code / Question ] Item Combo Restriction [ LHZ Card ] Drop Item Upon Death PVP Switcher + Announcer [ Guild Master ] Rotating Waitingroom Messages +10 Refiner [ Specific Items ] Random Rate Item Exchanger MVP Invasion Premium Users [ Boost Rates ] Display Cutin Image upon Login Custom Randomed Box Items Kick GM during WOE Custom Crafting NPC Restrict Same IP [ Certain Map ] Coloured Items Exchanger Guild Master Changer Party Team PK Match Gambling Game IRC Channel Crafting NPC Guild Storage Restriction Stage Game [ Version 4 ] Monster Wiki Event [ Version 3 ] Special Thank you for my Tutor : Notes : I am a bit lazy to write all those Script Descriptions, i do believe that all of you able to get how this script works. Anyway, i will still doing my best to write the Updated Changelog or informations about the script as detail as possible. All the Scripts above are uploaded to Pastebin . Abide the Following Rule : Scripts Error / Not Working , you have to Explain it in Details. ( Add in Images / Modified Scripts ) Do not SPAM / BUMP in my Topic. Do not ask for Support stuffs for other Scripts in this Topic. Link Down , then drop [ @Emistry ] a message. I Reserved the Right for NOT Answering your Posts if you did not abide my Topic's Rules. Keep This In Your Mind : All the Scripts i distribute here are NOT FOR COMMERCIAL USES . DO NOT remove my Credits if you are using part of the scripts to modify your own. DO NOT re-release the scripts in any form / way. If you ♥ these Scripts , Click on to Vote this Topic up. Or you may also click on at above the Topic
    1 point
  6. Hi guys i made this simple modification to stop corruption in my server... This little snippet would allow you to stop GMs from abusing @monster command.. it will announce the Monster name, Amount and also the location with the GM name so its very easy to know if it was for an Purpose or just for abuse.... /*========================================== * *------------------------------------------*/ ACMD_FUNC(monster) { char name[NAME_LENGTH]; char monster[NAME_LENGTH]; int mob_id; int number = 0; int count; int i, k, range; short mx, my; nullpo_retr(-1, sd); memset(name, '0', sizeof(name)); memset(monster, '0', sizeof(monster)); memset(atcmd_output, '0', sizeof(atcmd_output)); if (!message || !*message) { clif_displaymessage(fd, msg_txt(80)); // Give the display name or monster name/id please. return -1; } if (sscanf(message, ""%23[^"]" %23s %d", name, monster, &number) > 1 || sscanf(message, "%23s "%23[^"]" %d", monster, name, &number) > 1) { //All data can be left as it is. } else if ((count=sscanf(message, "%23s %d %23s", monster, &number, name)) > 1) { //Here, it is possible name was not given and we are using monster for it. if (count < 3) //Blank mob's name. name[0] = '0'; } else if (sscanf(message, "%23s %23s %d", name, monster, &number) > 1) { //All data can be left as it is. } else if (sscanf(message, "%23s", monster) > 0) { //As before, name may be already filled. name[0] = '0'; } else { clif_displaymessage(fd, msg_txt(80)); // Give a display name and monster name/id please. return -1; } if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number) mob_id = mobdb_checkid(atoi(monster)); if (mob_id == 0) { clif_displaymessage(fd, msg_txt(40)); // Invalid monster ID or name. return -1; } if (mob_id == MOBID_EMPERIUM) { clif_displaymessage(fd, msg_txt(83)); // Monster 'Emperium' cannot be spawned. return -1; } if (number <= 0) number = 1; if (strlen(name) < 1) strcpy(name, "--ja--"); // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive if (battle_config.atc_spawn_quantity_limit && number > battle_config.atc_spawn_quantity_limit) number = battle_config.atc_spawn_quantity_limit; if (battle_config.etc_log) ShowInfo("%s monster='%s' name='%s' id=%d count=%d (%d,%d)n", command, monster, name, mob_id, number, sd->bl.x, sd->bl.y); count = 0; range = (int)sqrt((float)number) +2; // calculation of an odd number (+ 4 area around) for (i = 0; i < number; i++) { map_search_freecell(&sd->bl, 0, &mx, &my, range, range, 0); k = mob_once_spawn(sd, sd->bl.m, mx, my, name, mob_id, 1, ""); count += (k != 0) ? 1 : 0; } if (count != 0) if (number == count){ if(pc_isGM(sd)==99){ // Checks if the GM level is below 99 Announcement is made [Vengeance] clif_displaymessage(fd, msg_txt(39)); // All monster summoned! } else { sprintf(atcmd_output, "%s summoned %d %s in %s,%d,%d", sd->status.name,number, monster, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); clif_displaymessage(fd, msg_txt(39)); // All monster summoned! } } else { sprintf(atcmd_output, "%s summoned %d %s in %s,%d,%d", sd->status.name,number, monster, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); sprintf(atcmd_output, msg_txt(240), count); // %d monster(s) summoned! clif_displaymessage(fd, atcmd_output); } else { clif_displaymessage(fd, msg_txt(40)); // Invalid monster ID or name. return -1; } return 0; } // small monster spawning [Valaris] ACMD_FUNC(monstersmall) { char name[NAME_LENGTH] = ""; char monster[NAME_LENGTH] = ""; int mob_id = 0; int number = 0; int x = 0; int y = 0; int count; int i; nullpo_retr(-1, sd); if (!message || !*message) { clif_displaymessage(fd, "Give a monster name/id please."); return -1; } if (sscanf(message, ""%23[^"]" %23s %d %d %d", name, monster, &number, &x, &y) < 2 && sscanf(message, "%23s "%23[^"]" %d %d %d", monster, name, &number, &x, &y) < 2 && sscanf(message, "%23s %d %23s %d %d", monster, &number, name, &x, &y) < 1) { clif_displaymessage(fd, "Give a monster name/id please."); return -1; } // If monster identifier/name argument is a name if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number) mob_id = atoi(monster); if (mob_id == 0) { clif_displaymessage(fd, msg_txt(40)); return -1; } if (mob_id == MOBID_EMPERIUM) { clif_displaymessage(fd, msg_txt(83)); // Cannot spawn emperium return -1; } if (mobdb_checkid(mob_id) == 0) { clif_displaymessage(fd, "Invalid monster ID"); // Invalid Monster ID. return -1; } if (number <= 0) number = 1; if (strlen(name) < 1) strcpy(name, "--ja--"); // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit) number = battle_config.atc_spawn_quantity_limit; count = 0; for (i = 0; i < number; i++) { int mx, my; if (x <= 0) mx = sd->bl.x + (rand() % 11 - 5); else mx = x; if (y <= 0) my = sd->bl.y + (rand() % 11 - 5); else my = y; count += (mob_once_spawn(sd, sd->bl.m, mx, my, name, mob_id, 1, "2") != 0) ? 1 : 0; } if (count != 0) { if(pc_isGM(sd)==99){// Checks if the GM level is below 99 Announcement is made [Vengeance] clif_displaymessage(fd, msg_txt(39)); // All monster summoned! } else{ sprintf(atcmd_output, "%s summoned %d small %s in %s,%d,%d", sd->status.name, number, monster, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); clif_displaymessage(fd, msg_txt(39)); // Monster Summoned!! } } else clif_displaymessage(fd, msg_txt(40)); // Invalid Monster ID. return 0; } // big monster spawning [Valaris] ACMD_FUNC(monsterbig) { char name[NAME_LENGTH] = ""; char monster[NAME_LENGTH] = ""; int mob_id = 0; int number = 0; int x = 0; int y = 0; int count; int i; nullpo_retr(-1, sd); if (!message || !*message) { clif_displaymessage(fd, "Give a monster name/id please."); return -1; } if (sscanf(message, ""%23[^"]" %23s %d %d %d", name, monster, &number, &x, &y) < 2 && sscanf(message, "%23s "%23[^"]" %d %d %d", monster, name, &number, &x, &y) < 2 && sscanf(message, "%23s %d %23s %d %d", monster, &number, name, &x, &y) < 1) { clif_displaymessage(fd, "Give a monster name/id please."); return -1; } // If monster identifier/name argument is a name if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number) mob_id = atoi(monster); if (mob_id == 0) { clif_displaymessage(fd, msg_txt(40)); return -1; } if (mob_id == MOBID_EMPERIUM) { clif_displaymessage(fd, msg_txt(83)); // Cannot spawn emperium return -1; } if (mobdb_checkid(mob_id) == 0) { clif_displaymessage(fd, "Invalid monster ID"); // Invalid Monster ID. return -1; } if (number <= 0) number = 1; if (strlen(name) < 1) strcpy(name, "--ja--"); // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit) number = battle_config.atc_spawn_quantity_limit; count = 0; for (i = 0; i < number; i++) { int mx, my; if (x <= 0) mx = sd->bl.x + (rand() % 11 - 5); else mx = x; if (y <= 0) my = sd->bl.y + (rand() % 11 - 5); else my = y; count += (mob_once_spawn(sd, sd->bl.m, mx, my, name, mob_id, 1, "4") != 0) ? 1 : 0; } if (count != 0) { if(pc_isGM(sd)==99){// Checks if the GM level is below 99 Announcement is made [Vengeance] clif_displaymessage(fd, msg_txt(39)); // All monster summoned! } else{ sprintf(atcmd_output, "%s summoned %d big %s in %s,%d,%d", sd->status.name, number, monster, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); intif_broadcast(atcmd_output, strlen(atcmd_output) + 1, 0); clif_displaymessage(fd, msg_txt(39)); // Monster Summoned!! } } else clif_displaymessage(fd, msg_txt(40)); // Invalid Monster ID. return 0; } Just copy paste this Snippet. Download from here
    1 point
  7. This is the full website : http://www.dotaragnarok.com/ This is HTML base. I have many ideas more to add but because of lack of knowledge with PHP, CSS, Flux CP Intergration I was at my limit. Ideas I cannot do to my website : I want to put a Login box at the site menu. I want the CP with this design (if you click CP it will redirect you to Old Flux Theme) Person Login and many more. Please rate it thanks (and be nice ) -If any web developer want to collaborate with me I'm happy to do so. I can design and good with photoshop but suck at coding. PM me thanks -If any you guys can help me with the "I cannot do" also great help to me
    1 point
  8. Todo eso son tonterias, que cada uno use lo que quiera, yo seguire usando rAthena. Es verdad y no podeis negarlo que ese foro está algo recargado y que hay secciones que tienen post de hace meses y son los más nuevos. El mundo ragnarok online exceptuando algunas comunidades oficiales y algun pserver ha pegado un gran bajonazo yo por eso ahora solo me dedico a jugar al kRO y sacar info... practicamente ya no scripteo nada. Es mejor trabajar sobre los .sc oficiales. Lo dicho que cada uno use lo que quiera, y nadie ataca a nadie....solo que fuisteis vosotros mismos los que pusierón en entredicho esta sección en el foro rAthena. nadie os obliga a usarlo como nadie obliga a entrar en el otro foro. Todo lo demas es gastar texto de teclado para formar un mal ambiente....
    1 point
  9. No le hace falta un dedicado, no. Definitivamente con las visitas que tiene un dedicado le sobraría, y como bien dices en Alexa: Very Slow (4.287 Seconds), 94% of sites are faster . 5 segundos en cargar, un dedicado no tarda eso, y si lo tiene que cambien de host, porque 5 segundos en cargar, en un servidor dedicado...
    1 point
  10. Pues déjame decirte que este proyecto es completamente gratis. Por lo menos si vas a empezar un proyecto como tal, ten la decencia de brindar un estilo amigable; de quien es la bronca si ustedes están poniendo tanta "cosa"? no creo que sea de los usuarios verdad? Obviamente es de los "manager" de ese proyecto, así que...La verdad? ustedes gastan de más porque quieren, si vas a manejar algo así ya es cosa de preguntarle a los usuarios si les gusta, que podemos hacer para mejorar, a lo mejor reducir las imágenes, no se, algo, pero si, es muy incomodo, y vuelvo a repetir, ustedes gastan de más porque quieren, si lo supieran manejar bien, no habría tanta bronca. No me vengas hablar a mi de gastar si yo entiendo de todo eso, una cosa es saber gastar, y otra cosa es gastar "a lo wey" como decimos en México. Edit: Apesar de eso, se han ganado a la mayoria de los latinos, y dan buen soporte, eso nadie lo niega, pero bueno! no todos somos iguales ;
    1 point
  11. Thanks to all who attempt to do it! Kudos!
    1 point
  12. A mi tambien me gusta mas este foro, presenta un mejor espacio que Divine RO, aunque si hacen bastante falta los usuarios :S
    1 point
  13. La verdad...Es una lastima que los latinos no participen aquí o sean activos; Personalmente opino que los foros de divinero son muy incomodos, todos los ADS/Promociones que tiene lo hacen ver muy mal, el skin del foro es muy reluciente, bueno, principalmente los ads y todas las imagenes que posee, es demasiado, ya se ve como el nuevo perfil facebook (Todo amontonado) pero bueno yo se que a la mayoria de los latinos no les importa, pero a una persona como yo, si. Quieran o no, es la verdad, y a mi personalmente si me molesta. Lo unico que si admiro de divinero fue su tema de guias y F.A.Q pero aún asi la mayoria de todas esas guias estan desactualizadas. rAthena esta haciendo muy buen papel, sin mencionar los extraordinarios cambios que estamos realizando
    1 point
  14. Thanks guys I'm going to make another one after my sickness lol.
    1 point
  15. [script][npc] Advanced Tombstone v1.03 Зачастую игроки хотят знать, когда воскреснет MVP, да и кто такой супер-крутой его смог забить, а многим админам хотелось бы иметь удобный инструмент для работы с MVP (отключить не залезая в конфиги, убить, чтобы игроки могли спокойно бегать по локации или оживить убитого MVP для соискателей приключений). Описание Скрипт позволяет управлять MVP (и не только, при желание), получать информацию о состояние MVP. Скачать Скрипт версии 1.03: скачать (в базе монстров все mvp от 13.2, Maya Purple и один тестовый квестовый моб) (Используя скрипт вы обязуетесь следовать лицензионному соглашению указанному в скрипте) Вот список возможностей: После смерти Монстра создаётся Tombstone с информацией о монстре, кто его убил и времени его воскрешения; Имеется несколько режимов состояние монстра (Живой, мёртвый и ждёт воскрешения, отлючен); Запоминание режима даже после перезагрузки (координаты Tombstone так же запоминаются); При отключение выставляется в стандартно установленное место (Координаты прописываются в таблицу скрипта); Координаты respawn'а выставляются как и в map monster (а не как в areamonster, кому интересна разница читайте doc'и); Время respawn'а указывается как в map monster (а не как в оригинальном Tombstone); Можно указывать имя моба, а не брать стандартное из mobdb; Специальный NPC с помощью которого GM'ы могут управлять режимом монстров (Убить монстра, оживить немедленно, отключить) и получить некоторые сведения о состояние монстра; После смерти монстра создаётся NPC Tombstone с окном чата сообщающим когда монстр оживёт, что он отключен или был убит и квест завершён; При разговоре с NPC Tombstone сообщается имя убившего (отключившего) его персонажа, для GM'ов есть функция мгновенного оживления монстра; Создание монстра можно вызывать из любого скрипта (методом вызова глобальной функции), что позволяет делать квесты. Недостатки и ошибки Я могу назвать только одну ошибку — при использование GM команды @killmonster скрипт работает некорректно. Так же не работает зеркало (будет говорить, что MVP на карте необнаружены, imho, не критично, т.к. Tombstone показывает нужную информацию и без того). Если что-то найдёте — отписывайтесь. Скриншоты Примечание Базы монстров скрипта настроены на обычный сервер, не Renewal, если вам нужно для Renewal, то боюсь придётся немного потрудиться базы сильно отличаются. Вы так же должны очистить(закомментировать) все записи о расположение текущих монстров в скриптах NPC. Для доступа к MVP Master и функции оживления монстра из Tomb'а нужен GM уровень не ниже 50ого, иначе NPC вас будут просто троллить Таблица монстров скрипта Массивы данных: setarray .mvpbmid[0],0; // Mob ID setarray .mvpbdl1[0],0; // Respawn Delay1 (in seconds, if is 0 - then mob consider as Quest Mob and not creating on first OnInit) setarray .mvpbdl2[0],0; // Respawn Delay2 (in seconds, if is 0 - then not create Tomb and Chat Room) // Default Tombstone coordinates X,Y setarray .mvpbcdx[0],0; setarray .mvpbcdy[0],0; // Area coordinates to spawn X,Y,X1,Y1 (if X and Y = 0 - get random area) setarray .mvpbcx[0],0; setarray .mvpbcy[0],0; setarray .mvpbcx1[0],0; setarray .mvpbcy1[0],0; setarray .mvpbaname$[0],""; // Name for Admins NPC (if empty then get from MobDB) setarray .mvpbmname$[0],""; // Mob name setarray .mvpbevent$[0],""; // Do Event on Kill Monster (empty to nothing todo) mvpbmid — MobID (идентификатор монстра) соответствующий идентификатору в базе - mob_db.txt mvpbdl1 — Время респауна (указывается в секундах!), через какое минимальное кол-во времени монстр воскреснит, если значение установлено равное 0, то монстр считается квестовым и после своей смерти он не пересоздаётся, чат комната так же имеет иное содержание, а не время до следующего респауна mvpbdl2 — Разница во времени респауна (в большую сторону, указывается в секундах), если значение установлено равное 0, то после смерти монстра не создаётся его Tombstone mvpbcdx, mvpbcdy — Расположение по-умолчанию Tombstone (X, Y), это место, где будет установлен Tombstone при убийстве или отключение монстра через Admin NPC mvpbcx, mvpbcy, mvpbcx1, mvpbcy1 — X, Y - коордианты появления монстра (если координаты равны 0, то коордианты берутся случайным образом относительно всей локации), X1, Y1 - разброс в появление монстра (X, Y при этом являются центром зоны появления, а X1, Y1 - диаметром) mvpbaname$ — Название монстра для меню Admin NPC, если оставить пустым, то возьмётся имя из базы mvpbmname$ — Название монстра, можно указывать какое имя из базы брать ("--ja--" - корейское название, "--en--" - английское название, или указывать своё название) mvpbevent$ — Обработка Event после смерти моба, чаще всего необходима для создания квестов (смотрите пример в скрипте с Yggas'Worth) Пример для монстра Fallen Bishop: callsub(L_AddMobDB,1871,7200,600,238,73,236,78,21,18,"","--en--",""); Добавление монстра Добавление монстра проходит в две стадии — первая стадия включает в себя дубликата NPC на нужную локацию с определённым именем, вторая — прописывание данных в таблицу монстров скрипта. Итак, для начала добавляем дубликат NPC, тут ничего сложного, находим последнюю запись дубликатов, допустим, у нас всего два монстра и последняя запись, пусть будет примерно такая: prontera,0,0,0 duplicate(tombstone_dup) Tomb#2_mvp 565 Запоминаем, что название NPC — Tomb#2_mvp, сейчас нам очень важна скрытая часть названия «2_mvp» — здесь важная цифра, это «2», значит в таблице всего 2 монстра, добавляем нашего нового монстра, пусть это будет Beelzebub (#1873), заглядываем в npc/mobs/dungeons/abbey.txt и находим нашего монстра: abbey03,0,0,0,0 boss_monster Beelzebub 1873,1,43200000,600000,1 Комментируем эту строчку и добавляем после последнего найденного нами дубликата NPC в скрипте строчку, указывая в скрытом название NPC следующий номер (2_mvp был последним, значит теперь будет 3_mvp): abbey03,0,0,0 duplicate(tombstone_dup) Tomb#3_mvp 565 Отлично, теперь нам надо добавить информацию о монстре, добавляем в таблицу монстров скрипта строчку: callsub(L_AddMobDB,1873,43200,600,120,112,0,0,0,0,"","--en--",""); Монстр добавлен и при перезагрузке появится на указанной локации. Немного о глобальной функции Для взаимодействия самого скрипта монстров с внешними NPC было созданное небольшое API (не слишком хорошо написанное, но рабочее). Это функция tmvp_menu, она имеет входящие ключи для определения того, что именно вам нужно (getarg(0)), вот id ключей и их краткое описание: 0 - Вызывается при основном OnInit скрипта монстров, создаёт нужные переменные и устанавливает первый пункт для Admin NPC - «Nothing» 1 - Вызывается при OnInit скрипта монстров, запоминает нужные данные для последующей работы 2 - Возвращает созданное меню (список монстров со статусом, работает медленно, т.к. обращается к глобальным данным) 3 - Устанавливает режим монстра в «Суицид», входящим данным (getarg(1)) является номер пункта меню, возвращает 0 — если всё прошло успешно, 1 — монстр не может быть установлен в режим (режим уже установлен или монстр отключен) 4 - Устанавливает режим монстра в «Оживить», возвращает 0 — если монстр создан успешно, 1 — монстр уже создан и не может быть создан снова, входящим данным является номер монстра (mvpbid) в таблице монстров скрипта 5 - Возвращается текст из пункта меню (Обычно это имя монстра), входящим данным является номер пункта меню 6 - Устанавливает режим монстра в «Суицид», входящим данными является mvpbid и имя персонажа, которое будет установлено как имя убийцы монстра, возвращаемые данные такие же, как и для 3 7 - Возвращает состояние монстра (Текстовое сообщение), входящим данным является mvpbid 8 - Возвращается mvpbid, входящим данным является номер пункта меню 9 - Устанавливает режим монстра в «Убить и отключить», входяшими данными является mvpbid и имя персонажа, возвращает 0 — при успешном выполнение, 1 — если монстр уже отключён. Формат вызова функции: callfunc("tmvp_menu", <номер ключа>(, <входящие переменные>)); Входящие переменные: mvpbid — это ID монстра в таблице скрипта, это не одно и то же, что и MobID. номер пункта меню — это уникальный идентификатор пункта меню для Admin NPC, который создаётся в 0 и 1 ключах функции, вызывается такое меню ключом 2 charname — имя персонажа игрока Пример, убить монстра №2: callfunc("tmvp_menu", 6, 2, strcharinfo(0)); Пример, воскресить монстра №2: callfunc("tmvp_menu", 4, 2); Для наглядности в скрипт добавлен NPC Yggas'Worth, он создаёт Поринга с кастумным названием и ждёт пока вы его не убьёте. На самом деле это самый простой пример, но вы можете добавлять каких-либо сложных монстров и создавать на этой основе квесты. Немного о глобальных переменных Их несколько, но вы можете использовать их в своих скриптах для создания квестов: $tmvp<mvpbid>_state — Признак состояния монстра (см ниже) $tmvp<mvpbid>_nick$ — Имя персонажа убившего монстра (учтите, что при измененеие состояния эта переменная не очищается) $tmvp<mvpbid>_x и $tmvp<mvpbid>_y — Координаты где расположен Tombstone (учтите, что при измененеие состояния эта переменная не очищается) $tmvp<mvpbid>_time — Время (указан tick с момента начала эпохи) до начала действия признака события (используется только для подсчёта времени respawn'а монстра) $tmvp<mvpbid>_created — Создан ли монстр (необходимо для некоторых проверок) (0 - нет, не создан, 1 - создан и бегает) $tmvp<mvpbid>_frun — Первый или нет запуск (0 - первый запуск, 1 - запуск уже был), необходимо для квестовых мобов, чтобы они не создавались Признаки состояния монстров: 0 — Монстр жив и где-то бегает 1 — Признак на суицид 2 — Монстр убит и ожидает времени respawn'а 3 — Признак на немедленное оживление 4 — Признак на суицид и отключение 5 — Монстр отключён и ждёт включения 6 — Для квестового монстра, состояние его смерти (убит и ожидает оживления через квест) Вы можете использовать эти данные для написания скриптов квестов (смотрите пример в скрипте на Yggas'Worth). Механика Скрипт работает на режимах, это так называемые признаки событий, действия происходят не мгновенно, а только создают признак этого события. К примеру, вы выставляете монстру признак события на суицид, обработка этого события произойдёт в течени 5 секунд, когда внутренний обработчки скрипта распознает этот признак и примет решение о том, что нужно сделать. Итерация обработчика - 5 секунд (OnTimer5000), вы можете поменять это значение на другое, но на свой страх и риск, учтите, что чем меньше вы делаете время обработки, тем больше нагрузок создаётся на ваш сервер (я считаю идеальным обработку каждые 10 секунд, но выставил 5, чтобы задержка составляла минимальную серверную). Благодарности Своей девушке, что разрешала работать над скриптом по ночам Sanasol — автору основного скрипта, я взял кусочек его кода (функция вывода времени, копирайт указан в скрипте, прошу прощения, было лень писать точно такую же функцию). Heler'у — за то, что оказывал некоторую помощь. nndsl — за подкинутую идею.
    1 point
  16. Woah! It seems like we are going pretty far and being more efficient. This looks great! +1
    1 point
×
×
  • Create New...