Jump to content

Caspian

Members
  • Content Count

    109
  • Joined

  • Last visited

  • Days Won

    6

Reputation Activity

  1. Like
    Caspian reacted to keough in Prontera ROX   
    Hello and Good Day guys!
    It's nice to be back in the world of mapping! Here is a new look for Prontera!
     
    Check the in-game screenshot here, Hope you like it guys.
     
     
     
     
     
     
     
     


    You can Join my discord channel here : https://discord.gg/mBpSuXcB
  2. Like
    Caspian got a reaction from IndieRO in How to add Episode 17.2 maps(with his mobs)?   
    You have to add your map in map index list and also rebuild your mapcache. There are some tutorials here around the forum.
     
    Follow this guide:
     
     
  3. Like
    Caspian reacted to Aeromesi in Aeromesi's Fast as the Wind Ragnarok Services   
    I have updated my github. For anyone wanting to use my custom instances I'd suggest downloading them from my github for Hercules, the instances are updated to be fully working on latest Hercules servers as of the time of this post.

    https://github.com/Aeromesi/AeromesiCodes

    Also updated installation method and tried to make things a bit easier to understand for beginner developers.


    Updates:
    .mcache files are provided for re/pre-re
    Fixed ArrayShuffle function (Now Ice Titans attack El Dicastes should be working as well as Fiery Fairy Forest)
  4. Like
    Caspian reacted to Nyanko in Browedit-Fansite   
    Have you ever wanted to learn how to work with Browedit or Bromedit? Or perhaps you do work with these amazing tools but still have questions and get messages errors sometimes? Maybe it's none of the options before but yes a third one? Well, no matter the reason, you came to the right place! 
     
    The Browedit-Fansite is here to help you! The blog was created with the objective to reunite and organize all the information, tutorials and much more in one place, allowing you to find the information easily!
     
    Through it`s different sections you will be able to find resources for both Browedit and Bromedit, as well other kinds of resources. Not only that but we also offer the tutorial sections as well a F.A.Q section that is constantly updated.
     
    Interested? Then don't lose more time and come check it now!
     
    Our link: https://browedit-fansite.blogspot.com/
     
    And there is more! Have you checked the fansite, but couldn't find your question or a specific tutorial? In that case, join us on Browedit Official Discord as we have an official channel there, where you can talk about the latest updates from Browedit-Fansite, as well give your feedback, suggestions and so on! Not only that, but the discord also has support channels, where you can send your questions!
     
    Discord link: https://discord.gg/Kwb6ZQSFkF
     
    So don't waste anymore time and come join the community!
  5. Like
    Caspian got a reaction from Lergen in Untranslated buttons?   
    These are BMP images, you can find it in your GRF  and translate by editing the picture or you can find a data folder with these files already translated...
  6. Like
    Caspian reacted to 4144 in Upcoming hercules feature   
    Already merged into hercules
     
    New feature: Items preview in cash shop
     
    Can be enabled by:
    1. defining ENABLE_CASHSHOP_PREVIEW_PATCH in core.h or by configure flag --enable-cashshop-preview-patch
    2. Then need apply this nemo patch http://nemo.herc.ws/patches/ExtendCashShopPreview/
     
    Feature can works only if option in server side enabled and enabled patch in client side. In other case cash shop will be corrupted
     

     
  7. Like
    Caspian reacted to astralprojection in MvP Controller   
    //===== Hercules Script ====================================== // MVP Spawn Controller //===== By: ================================================== // astralprojektion //===== Current Version: ===================================== // 1.3 //===== Description: ========================================= // Control MVP Spawn with script. MVP will not respawn on server start or reload using flag. // Delete or Comment all MVP and mini boss spawn at npc/pre-re/mobs/dungeons/ or /fields. // Make sure set at NifInvasion to make it work. // OnLoDDead: // // Set LOD as dead ang next respawn is 5580sec // $S11373 = 2; $T11373 = (gettimetick(2) + 5580); // //===== Additional Comments: ================================= // 1.0 Initial Release // 1.1 Use TimeStamp when mvp is killed // Fixed typo on MVP_Map array. // 1.2 Set Variables to Global. // 1.3 Include some Mini Boss on the controller // Added PvP On/Off MvP is alive // Integrate LOD invasion // Added @mvpcontroller command to reset all or a specific mvp and other settings. //============================================================ /* Credits to Meko https://herc.ws/board/files/file/326-array-manipulation-functions/ */ function script array_find { .@size = getarraysize(getarg(0)); .@neq = getarg(2, false); freeloop(true); for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) { if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) || (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) { freeloop(false); return .@i; } } freeloop(false); return -1; } - script mvpcontroller FAKE_NPC,{ end; OnNPCKillEvent: if(array_find(.mvpid, killedrid) >= 0 ){ for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { if( killedrid == .mvpid[.@i] && strcharinfo(PC_MAP) == .mvpmaps$[.@i]) { // 1 - Alive 2 - Dead setd("$S"+.mvpa[.@i]+.mvpid[.@i], 2); // current time + respawn time (seconds) setd("$T"+.mvpa[.@i]+.mvpid[.@i],gettimetick(2)+(.mvptime[.@i]*60)); setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", strcharinfo(PC_NAME)); if( killedrid == 1120 || killedrid == 1096 || killedrid == 1388 ) { if(.announce) announce "A mini boss monster [ "+strmobinfo(1,killedrid)+" ] at "+strcharinfo(PC_MAP)+" has been slain.",bc_all; } else { if(.announce) announce "A boss monster [ "+strmobinfo(1,killedrid)+" ] at "+strcharinfo(PC_MAP)+" has been slain.",bc_all; if(.pvp){ removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } } break; } } } end; OnSettings: while(1){ switch(select( " ~ PvP On Map [ "+((.pvp)?"^28bf00Yes^000000":"^ff0000No^000000")+" ]:"+ " ~ Announce [ "+((.announce)?"^28bf00Yes^000000":"^ff0000No^000000")+" ]:"+ " ~ Reset All MvP:"+ " ~ Reset Specific MvP:"+ " ~ ^777777Close^000000" )) { case 1: .pvp =! .pvp; for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) < 2 || getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2) ) { // if mini boss, just ignore pvp if(.pvp){ if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){ //PASS THROUGH } else { setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpon .mvpmaps$[.@i]; } } else { removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } } } break; case 2: .announce =! .announce; break; case 3: freeloop(1); for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1); setd("$T"+.mvpa[.@i]+.mvpid[.@i], 0); setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$",""); killmonsterall .mvpmaps$[.@i]; } for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) { // Baphomet monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) { // Drake monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) { // moonlight monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) { // turtle monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) { // amon monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) { // lady monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) { // LOD donpcevent("NifInvasion::OnSpawn"); } else { monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1; } if(.pvp){ if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){ //PASS THROUGH } else { setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpon .mvpmaps$[.@i]; } } else { removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } } freeloop(0); dispbottom "All MVP has been reset."; break; case 4: set .@menu$,""; freeloop(1); for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) set .@menu$, .@menu$+getmonsterinfo(.mvpid[.@i],0)+" - ("+.mvpmaps$[.@i]+"):"; set .@menu$, .@menu$+" ~ ^777777Cancel^000000"; freeloop(0); set .@i, select(.@menu$)-1; setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1); setd("$T"+.mvpa[.@i]+.mvpid[.@i], 0); setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$",""); killmonsterall .mvpmaps$[.@i]; monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1; if(.pvp){ if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){ //PASS THROUGH } else { setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpon .mvpmaps$[.@i]; } } else { removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } dispbottom "Monster [ "+strmobinfo(1,.mvpid[.@i])+" ] at "+.mvpmaps$[.@i]+" has been reset."; break; default: close; } } close; OnTimer60000: // Let recheck after a minute. for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { /* $S 1 - Alive $S 2 - Dead */ // If MvP status is not yet set if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) == 2 && getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2) ) { // check if MvP has fixed spawn location in the map. if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) { // Baphomet monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) { // Drake monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) { // moonlight monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) { // turtle monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) { // amon monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) { // lady monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1; // Initiate LOD invasion at Niflheim } else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) { // LOD donpcevent("NifInvasion::OnSpawn"); } else { // Spawn the MvP at random location. monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1; } if(.announce) announce "Monster [ "+strmobinfo(1,.mvpid[.@i])+" ] at "+.mvpmaps$[.@i]+" has been spawned.",bc_all; // set status of MvP as ALIVE! setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1); // reset killer name. setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", ""); if(.pvp){ // if mini boss, just ignore pvp if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){ //PASS THROUGH } else { setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpon .mvpmaps$[.@i]; } } else { removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } } } initnpctimer(); end; OnCheck: OnPCLoginEvent: .@rank = 0; query_sql "SELECT DATABASE()", .@rag_db$; query_logsql "SELECT DATABASE()", .@log_db$; query_sql( "SELECT COUNT(`monster_id`) AS `total`,`char`.`name`,`kill_char_id` FROM "+.@log_db$+".`mvplog`"+" LEFT JOIN "+.@rag_db$+".`char` ON `char`.`char_id` = `mvplog`.`kill_char_id` WHERE `map` <> 'guild_vs5' AND DATE_FORMAT( `mvp_date`, '%Y-%m-%d') = DATE_FORMAT( now(), '%Y-%m-%d') GROUP BY `kill_char_id` ORDER BY `total` DESC LIMIT 10",.@mvptotal,.@mvpname$,.@kill_char_id ); for( .@i = 0; .@i < getarraysize(.@kill_char_id); .@i++ ) { if(getcharid(CHAR_ID_CHAR) == .@kill_char_id[.@i]){ .@rank = .@i+1; .@total = .@mvptotal[.@i]; } } if ( .@rank > 0 && .@rank < 4 ) { if(countitem(.topreward) == 0){ dispbottom "Congratulations you ranked as #"+.@rank+" MvP Hunter for today. Total kill "+.@total; getitembound .topreward,1,4; equip(.topreward); } } else { if(countitem(.topreward) > 0){ delitem .topreward,countitem(.topreward); dispbottom "Sorry you have lost your rank as Top 3 MvP Hunter of the day."; } } addtimer 300000,strnpcinfo(0) + "::OnCheck"; end; OnInit: .topreward = 31488; // top mvp daily reward .toprange = 3; // Only Top 3 gets the reward .announce = 1; // shall we announce mvp kills and spawn? (yes = 1 no = 0) .pvp = 1; // shall will make the map pvp? (yes = 1 no = 0) bindatcmd("mvpcontroller","mvpcontroller::OnSettings",99,99); // Mvp ids setarray .mvpid[0],1511,1096,1096,1388,1039,1272,1272,1046,1046,1389,1112,1115,1115,1418,1252,1120,1120,1120,1120,1086,1492,1251,1147,1147,1059,1150,1087,1190,1038,1157,1159,1312,1373,1630,1688; // Mvp Index is used because there are same mvp that spawn on different maps. setarray .mvpa[0],1,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,3,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1; // MvP maps setarray .mvpmaps$[0],"moc_pryd06","pay_fild04","xmas_dun01","yuno_fild02","prt_maze03","gl_chyard","gld_dun04","gef_dun02","gld_dun02","gef_dun01","treasure02","gld_dun01","pay_fild11","gon_dun03","xmas_fild01","gld_dun04","pay_fild04","prt_maze03","treasure02","prt_sewb4","ama_dun03","xmas_dun02","anthell02","gld_dun03","mjolnir_04","pay_dun04","gef_fild14","gef_fild10","moc_pryd04","in_sphinx5","moc_fild15","tur_dun04","niflheim","lou_dun03","ayo_dun02"; // How many minutes to respawn? setarray .mvptime[0],60,60,60,60,120,60,480,120,480,60,120,480,120,95,120,240,60,114,32,60,91,60,120,480,120,60,60,120,60,60,120,60,93,117,420; freeloop(1); for( .@i = 0; .@i < getarraysize(.mvpid); .@i++ ) { // If MvP status is not yet set if ( getd("$S"+.mvpa[.@i]+.mvpid[.@i]) < 2 || getd("$T"+.mvpa[.@i]+.mvpid[.@i]) <= gettimetick(2) ) { // check if MvP has fixed spawn location in the map. if( compare( .mvpmaps$[.@i], "prt_maze03" ) && .mvpid[.@i] == 1039 ) { // Baphomet monster .mvpmaps$[.@i],100,100,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "treasure02" ) && .mvpid[.@i] == 1112 ) { // Drake monster .mvpmaps$[.@i],101,151,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "pay_dun04" ) && .mvpid[.@i] == 1150 ) { // moonlight monster .mvpmaps$[.@i],120,115,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "tur_dun04" ) && .mvpid[.@i] == 1312 ) { // turtle monster .mvpmaps$[.@i],99,93,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "moc_pryd06" ) && .mvpid[.@i] == 1511 ) { // amon monster .mvpmaps$[.@i],102,166,"--ja--",.mvpid[.@i],1; } else if( compare( .mvpmaps$[.@i], "ayo_dun02" ) && .mvpid[.@i] == 1688 ) { // lady monster .mvpmaps$[.@i],150,90,"--ja--",.mvpid[.@i],1; // Initiate LOD invasion at Niflheim } else if( compare( .mvpmaps$[.@i], "niflheim" ) && .mvpid[.@i] == 1373 ) { // LOD donpcevent("NifInvasion::OnSpawn"); } else { // Spawn the MvP at random location. monster .mvpmaps$[.@i],0,0,"--ja--",.mvpid[.@i],1; } // set status of MvP as ALIVE! setd("$S"+.mvpa[.@i]+.mvpid[.@i], 1); // status is alive (1) // reset killer name. setd("$P"+.mvpa[.@i]+.mvpid[.@i]+"$", ""); // killer name reset if(.pvp){ // if mini boss, just ignore pvp if(.mvpid[.@i] == 1120 || .mvpid[.@i] == 1096 || .mvpid[.@i] == 1388 ){ //PASS THROUGH } else { setmapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpon .mvpmaps$[.@i]; } } else { removemapflag .mvpmaps$[.@i], mf_pvp_nocalcrank; pvpoff .mvpmaps$[.@i]; } } } freeloop(0); initnpctimer(); end; } /* If you want your player have access to spawn time, you can use this function to display status of each MvP and who killed them { Id: 501 AegisName: "Red_Potion" Name: "Red Potion" Type: "IT_HEALING" Buy: 50 Weight: 70 Script: <" callfunc "F_MVPTime"; "> }, */ function script F_MVPTime { mes "^FF0000MvP Status^000000"; for( .@i = 0; .@i < getarraysize(getvariableofnpc(.mvpid,"mvpcontroller")); .@i++ ) { .@time = getd("$T" +getvariableofnpc(.mvpindex[.@i],"mvpcontroller") + getvariableofnpc(.mvpid[.@i],"mvpcontroller")); .@alive = getd("$S" +getvariableofnpc(.mvpindex[.@i],"mvpcontroller") + getvariableofnpc(.mvpid[.@i],"mvpcontroller")); set .@hours, (.@time - gettimetick(2)) / 3600; set .@mins, (.@time - gettimetick(2))%3600/60; set .@secs, (.@time - gettimetick(2))%60; set .@mobname$,getmonsterinfo( getvariableofnpc(.mvpid[.@i], "mvpcontroller"),0 ); set .@map$,getvariableofnpc(.mvpmaps$[.@i], "mvpcontroller"); set .@player$,getd("$P"+getvariableofnpc(.mvpindex[.@i], "mvpcontroller") + getvariableofnpc(.mvpid[.@i], "mvpcontroller") +"$"); mes ((.@alive == 1) ? "[ ^01DF01+^000000 ]" : "[ ^FF0000x^000000 ]")+((getstrlen( .@mobname$ ) > 10 ) ? " ^0055FF"+substr(.@mobname$,0, 10)+"^000000" : " ^0055FF"+.@mobname$+"^000000")+" ^777777"+.@map$+"^000000 "; if( .@alive == 2 ) { mes "^FF0000"+((.@hours) ? .@hours +"h" : "")+" "+((.@mins) ? .@mins +"m" : "")+" "+((.@secs) ? .@secs +"s" : "")+"^000000 "+"^777777 kiiled by "+.@player$+"^000000"; } } close; } What does it do?
    -  prevents spawn of mvp on each server starts or reload.
    -  spawns mvp or mini only at specific time based when it was killed + spawn time
    -  reward x top mvp killers.

    Cons:
    - you can not use convex mirrors to show mvp in the map
    - you can not find mvp using @whereis.

    How to use:
    - Delete or Comment target MVP and mini boss spawn from your npc/pre-re/mobs/dungeons/ or /fields.
    - Add these mvps to array.

    FAQ:
    #Q1 What the heck is this?
    setarray .mvpa[0],1,1,2,1,1,1,2,1,2,1,1,1,2,1,1,1,2,3,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1; #A1: since there are same kind of MVP spawn on multile map (i.e Angeling spawns at pay_fild04, xmas_dun01, yuno_fild03) those numbers are the unique identifiers. 
    if there is only 1 spawn, then just write 1. 
    succeeding spawn is 2  then 3 ....

    All other suggestions to simplify and improve @AnnieRuru yohoo! my master.  
     
  8. Like
    Caspian got a reaction from sonyk2 in help with F Ticket AddVip wanted to integrate it with the npc I have   
    First you need to type in english, here is an international community.
    If you want support in your mother language, you should have opened a topic in the portuguese support section.
  9. Like
    Caspian reacted to pagerasta in sufixo/prefixo de carta bugado   
    Consegui num server aleatório que eu jogava aqui kkkkk.
    Valeu pela ajuda!!
    Resolvido, pode fechar.
  10. Like
    Caspian got a reaction from pagerasta in sufixo/prefixo de carta bugado   
    Dá uma olhada na sua GRF no arquivo cardprefixnametable.txt. E olha como estão os nomes lá.
  11. Like
    Caspian got a reaction from pagerasta in sufixo/prefixo de carta bugado   
    Sim, é por isso então, tenta achar uma data com os arquivos já traduzidos em portugues, tem várias por aí.
  12. Like
    Caspian got a reaction from JulioCF in Duvida Em colocar o servidor pre re   
    Src -> config-> renewal -> tirar as duas barras antes do "//#define DISABLE_RENEWAL" = "#define DISABLE_RENEWAL".
  13. Like
    Caspian reacted to Neo-Mind in WARP - A successor to NEMO   
    Happy Thanksgiving everyone. Since I couldn't get the turkey, I thought I would bring this instead. 
    Without further ado, Let me introduce...

    WARP (Windows Application Revamp Package)
    Why this name?
    Because I like using acronyms and this name sounded apt. Plus it's the function & features that matter more.
    And no, I am not gonna change the name.
      Why not just fix up NEMO?
    The codebase for NEMO is pretty much ancient at this point. So rather than fixing it up, I decided to go the route of creating it fresh from scratch. The end result is a far superior product. 
      OK, but what if you end up AFRO (Away From RO)again?
    Well, I can't promise that I will be around forever. However, this time around, I am releasing the source code for the tool as well.
      So, exactly what has changed?
    Well, quite a few things. Let's start off with how the GUI looks now.

      As you can see, the GUI is much more modern and aesthetically pleasing thanks to @Haziel & @Hadrias.
      The package comes with 3 tools - Console version (for simple patching), Main GUI, and Tester GUI (for batch testing).
      A big salute to @4144  for keeping NEMO alive while I was AFRO 😄.
    Ok, jokes aside, I discussed with him about the changes he made and I have incorporated almost all of them but with some differences. 
      Language & Styles are now on the bottom as you can see. All the remaining menus have now been shifted to drawers (moving side panels). To reveal them you can either swipe from the respective edge or click the button at the top. 
      The right side drawer houses all the Extensions (Used to be called 'Addons' in NEMO).
    They are now loaded independently of the client. This avoids unnecessary redefinitions and now you can also use Extensions for activities that don't need a loaded client.
      All the common functions have been added to the 'Quick Actions' group and all the remaining ones are in the left drawer, which is not many. If you have suggestions for more features let me know.

    Moving on to the Back end (This is of no use to the regular user. So you can skip this part if you want)
      It was high time for us to have a proper input file format. Enter YAML. Love it or hate it but it's here to stay.
    Frankly, I like it more than libconfig and INI. You would be seeing YAML being used for almost every file in WARP.
    This includes input files for Patches & Extensions, Files defining those two, Session files, etc.
      Writing patches is far more flexible now. Say goodbye to PTYPE_HEX and \xAB. Now we can do wild card searches with the actual wild cards inside hex codes. Of course, we still need to have some well-defined characters for that.
    Currently, we have 2 forms of wildcards - Nibble wise - For e.g. => A?, ??, ?3 Bit wise - For e.g. => [1.0...01] 
      If you have any suggestions about it let me know.
      Speaking of writing hex code, I have provided functions looking almost identical to Assembly instructions for generating their equivalent hex code. This helps in making the hex code more human-readable and adds a little more flexibility.
      User inputs have a few more types and little more flexibility in specifying constraints now. 
      Scripts have proper segregation now. Please follow them when adding your own.
    Only the scripts inside the 'Init' folder gets reloaded each time the client is loaded. This avoids unnecessary reloads.
      exe has now become 'Exe'.  But in addition to this, you get 2 more objects - System (for filesystem activities) & Warp (whatever is outside the scope of the other two)
      Many of the functions used for retrieving some constant information in the 'Exe' have become properties now. For e.g. PEoffset, ImageBase, BuildDate, etc.

      During patching, the Diff section is only added if you have inserted any code using one of the 'Add' functions. Also, the Diff section now grows dynamically as per requirement (in increments of Section Alignment of course).
      In addition to the Patched Exe, The tool also generates an (Extra Patch Info) file with the suffix '.epi'. It holds just enough info for the tool to recognize existing patches in an exe from a previous patch session. 
    So how is it useful? Let's say you have a patched client and its EPI file. But you don't have the original anymore.
    Now you can remove 1 or 2 patches and keep the rest OR even restore the original from the patched exe.
      Last, but not least, I am providing documentation about everything including the API. But bear with me for a bit, as I am still working on the documentation part.
      I probably forgot more points to add here, but I think this pretty much covers the important stuff. Anyway, the documentation would be pretty comprehensive.
      Is it ready to be used now? The tool is definitely ready. I have added most of the patches but not all just yet.
      But I was not able to test all the patches in-game. So please don't attack me if something failed.
    I would appreciate a Bug Request in Github instead.
      Also note, that some patches are still failing for new clients, and some failing for old ones. However, I saw the same behavior in NEMO, so that would be part of the next stage of operations - Updating Patch scripts.
      So, where do I get it from?
    https://github.com/Neo-Mind/WARP
      How to use it?
    There is a User Guide in the git repo (best viewed from Github itself). Everyone is used to NEMO by now, so it shouldn't be difficult to use this even without the guide. Plus the Github wiki is pretty detailed. 
      Any last words before we close this?
    Just like in the case of NEMO, my intention with WARP is to create a common tool for patching without being restricted to RO or which OS you use it in. For this reason, you will be seeing multiple branches in the Git repo.

    If you are planning to use WARP for patching some other application, Create a branch using the 'win32' branch as a starting point.


    That's about it from me for now.

     
  14. Upvote
    Caspian reacted to AnnieRuru in hosting Hercules on Google Cloud with CentOS 8   
    Over the last few days I have been playing with Google Cloud services
    because Google cloud currently offers $300 free credit upon signing up
    yes, FREE $300 credit
    and thus my journey trying to host hercules server on a VPS has begun
     
    all you need is a valid Debit/Credit card number ...
    of course you have to be an adult to try the hosting service ... right ?
     

     
     
    oh and, don't worry, you can always cancel it anytime

     
    after playing with it, I found the Windows option is too expensive, and thus trying to learn the Linux option
     
    This guide is actually demonstrate by using a trash gmail account that can throw away later
    I don't mind all the credentials are shown in the screenshot, when I click the Open topic button I have deleted this project on Google Cloud
     
     
    Step 1. Download Putty and WinCP
    https://www.putty.org/.
    https://winscp.net/eng/download.php
     
    Step 2. Run Google Cloud
    2.1 login to your Google cloud project
    https://github.com/AnnieRuru/customs/blob/master/server hosting/2.png
     
    2.2 first you need to link your credit card to this google cloud
    https://github.com/AnnieRuru/customs/blob/master/server hosting/3.png.
    https://github.com/AnnieRuru/customs/blob/master/server hosting/4.png
    select the billing option to the debit/credit number you input earlier
    https://github.com/AnnieRuru/customs/blob/master/server hosting/5.png
    this billing information is very important, you need to check this once in a while to stop unwanted services <-- please scroll to the right
     
    2.3 pin these 3
    - billing
    - compute engine
    - VPC network
    https://github.com/AnnieRuru/customs/blob/master/server hosting/6.png
     
    2.4 now time to create a VPS, select Compute Engine
    https://github.com/AnnieRuru/customs/blob/master/server hosting/7.png
    2.4.1
    enter all the necessary information
    1. the Virtual machine name
    2. your nearest location
    3. the spec of the machine
    https://github.com/AnnieRuru/customs/blob/master/server hosting/8.png
     
    PS: I tested the cheapest option, N1 series, f1 micro 614MB memory and E2 micro, 1GB memory
    when compiling hercules later, putty just stop ... I think it run out of memory
    ... hercules should have mention a recommendation needs at least 2GB memory to run
     
    2.4.2
    4. Select Boot Disk as CentOS 8
    https://github.com/AnnieRuru/customs/blob/master/server hosting/9.png
    5. select allow HTTP and HTTPS
    https://github.com/AnnieRuru/customs/blob/master/server hosting/10.png
     
    2.4.3
    6. Click Security tab
    https://github.com/AnnieRuru/customs/blob/master/server hosting/11.png
    needs to 'Enter public SSH key'
     
    run Putty Key Generator and click Generate
    https://github.com/AnnieRuru/customs/blob/master/server hosting/12.png
     
    1. change the 'key comment' as it will become user name
    2. save private key to desktop
    3. copy the field
    https://github.com/AnnieRuru/customs/blob/master/server hosting/13.png
     
    paste into Google cloud
    https://github.com/AnnieRuru/customs/blob/master/server hosting/14.png
     
    2.4.4
    select Networking tab
    https://github.com/AnnieRuru/customs/blob/master/server hosting/15.png
    create a static IP address
    https://github.com/AnnieRuru/customs/blob/master/server hosting/16.png
    choose standard tier
     
    after everything done click [Confirm]
    https://github.com/AnnieRuru/customs/blob/master/server hosting/17.png
    and you get your virtual machine running
    https://github.com/AnnieRuru/customs/blob/master/server hosting/18.png
     
    2.5
    once your server up and running
    run Putty to connect to this server
    https://github.com/AnnieRuru/customs/blob/master/server hosting/19.png
    1. scroll down, expand 'SSH' to select 'Auth',
    2. then load the file you saved earlier by PuttyGen
    https://github.com/AnnieRuru/customs/blob/master/server hosting/20.png
    3. enter the public IP address,
    4. then click open
     
    https://github.com/AnnieRuru/customs/blob/master/server hosting/21.png
    it will prompt you with security alert, just click yes
     
    2.6
    login with your user name
    https://github.com/AnnieRuru/customs/blob/master/server hosting/22.png
     
    The very first command you should run is change the password
    sudo passwd root ok Windows Users, don't freak out like me
    there are no ******** when you input the password, this is Linux not Windows
    just input normally ... and press Enter key, it works that way
    https://github.com/AnnieRuru/customs/blob/master/server hosting/23.png
    then do the same with your username
    sudo passwd annie  
    3. update the OS and install all necessary product
     
    3.1 run all these commands
    sudo yum update sudo yum install gcc make mysql mysql-devel mysql-server pcre-devel git zlib-devel Transaction Summary ================================================================================ Install 89 Packages Total download size: 108 M Installed size: 395 M Is this ok [y/N]: Press 'Y' key
     
    3.2
    in the meantime, while this might take awhile, try login WinCP
    https://github.com/AnnieRuru/customs/blob/master/server hosting/24.png
    click new session, then click advance
    https://github.com/AnnieRuru/customs/blob/master/server hosting/25.png
    select 'Authentication' and load the Putty Gen file again
    https://github.com/AnnieRuru/customs/blob/master/server hosting/26.png
    just another warning
    https://github.com/AnnieRuru/customs/blob/master/server hosting/27.png
     
     
    3.3 Download Hercules
    git clone https://github.com/HerculesWS/Hercules.git ~/Hercules  
    4. SQL
     
    4.1 Start SQL service
    sudo systemctl start mysqld.service  
    4.2 login as root
    mysql -u root -p Enter password, just press enter
    default centOS 8 preinstalled MySQL, root has no password
     
    Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.21 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 4.3 create database
    CREATE DATABASE hercules; 4.4 select hercules database as default
    USE `hercules`; 4.5 create another user, not recommend to connect as root
    CREATE USER 'annie'@'localhost' IDENTIFIED BY '1234'; 4.6 grant this user privilege
    GRANT SELECT,INSERT,UPDATE,DELETE ON * TO 'annie'@'localhost'; 4.7 then quit
    quit it should show like this
    mysql> quit Bye [annie@centos ~]$ 4.8 goto sql-files directory
    cd /home/annie/Hercules/sql-files/ and run all these
    mysql -u root -p hercules < main.sql mysql -u root -p hercules < logs.sql mysql -u root -p hercules < item_db_re.sql mysql -u root -p hercules < mob_db_re.sql mysql -u root -p hercules < mob_skill_db_re.sql it should show like this
    [annie@centos ~]$ cd /home/annie/Hercules/sql-files/ [annie@centos sql-files]$ mysql -u root -p hercules < main.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < logs.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < item_db_re.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < mob_db_re.sql Enter password: [annie@centos sql-files]$ mysql -u root -p hercules < mob_skill_db_re.sql Enter password: [annie@centos sql-files]$ 4.9 go back login mysql and change inter-server connection password from s1/p1 into qwer/asdf
    mysql -u root -p and
    UPDATE `hercules`.`login` SET `userid` = 'qwer', `user_pass` = 'asdf' WHERE `account_id` = 1;  
    5. Compile Hercules
     
    go back to annie/hercules folder
    cd /home/annie/Hercules/ 5.1 type ./configure
    ./configure  
    OK STOP, many things can go wrong here, I stuck here for a few days and searching on both rathena and hercules forum for answers
    the correct output from putty should be this
    checking mysql.h presence... yes checking for mysql.h... yes checking whether my_bool is supported (MySQL)... no (converting my_bool to bool) checking MySQL library (required)... yes (8.0.21) checking PCRE library... checking pcre.h usability... yes checking pcre.h presence... yes checking for pcre.h... yes checking for library containing pcre_study... -lpcre checking for doxygen... no checking for perl... yes configure: creating ./config.status config.status: creating Makefile config.status: creating src/common/Makefile config.status: creating 3rdparty/mt19937ar/Makefile config.status: creating 3rdparty/libconfig/Makefile config.status: creating 3rdparty/libbacktrace/Makefile config.status: creating 3rdparty/libbacktrace/backtrace-supported.h config.status: creating src/char/Makefile config.status: creating src/login/Makefile config.status: creating src/map/Makefile config.status: creating src/plugins/Makefile config.status: creating src/test/Makefile config.status: creating tools/HPMHookGen/Makefile config.status: creating tools/doxygen/Makefile [annie@centos Hercules]$ if it doesn't show config.status: at the end, open a new topic in Linux support
    if it's the same as mine, then can proceed with
     
    5.2 compile hercules
    make sql finally compile should show like this
    CC party.c CC path.c CC pc.c CC pc_groups.c CC pet.c CC quest.c CC refine.c CC rodex.c CC script.c CC searchstore.c CC skill.c CC status.c CC storage.c CC stylist.c CC trade.c CC unit.c CC vending.c LD map-server make[1]: Leaving directory '/home/annie/Hercules/src/map' building conf/import folder... [annie@centos Hercules]$  
    6. configure Hercules
     
    6.1 start hercules by
    ./athena-start start https://github.com/AnnieRuru/customs/blob/master/server hosting/28.png
    of course the reason why connect to SQL failed is because haven't configure Hercules so ....
    stop it from running for a moment
    ./athena-start stop  
    6.2 login to WinCP
    https://github.com/AnnieRuru/customs/blob/master/server hosting/29.png
    ... I will assume you know how to change your public IP address on hercules
    the file you should change are
    map-server.conf
    - userid: "qwer"
    - passwd: "asdf"
    - map_ip: "35.213.138.42"
    - char_ip: "35.213.138.42" char-server.conf
    - userid: "qwer"
    - passwd: "asdf"
    - login_ip: "35.213.138.42"
    - char_ip: "35.213.138.42" conf\global\sql_connections.conf
    -db_hostname: "localhost"
    - db_port: 3306
    - db_username: "annie"
    - db_password: "1234"
    - db_database: "hercules" conf\network.conf
    .....<let me test this thing again> ....  
    <--- I will assume everyone reading this guide already know how to host an offline server, if not click here -->
     
    now run ./athena-start start again, and this time map-server couldn't connect to char-server
     
    7. Configure firewall
     
    7.1 run these 3 commands
    sudo firewall-cmd --permanent --add-port 6900/tcp sudo firewall-cmd --permanent --add-port 6121/tcp sudo firewall-cmd --permanent --add-port 5121/tcp 7.2 reload the firewall settings
    sudo firewall-cmd --reload 7.3 go back to Google Cloud,
    https://github.com/AnnieRuru/customs/blob/master/server hosting/30.png
    to create firewall
    https://github.com/AnnieRuru/customs/blob/master/server hosting/31.png
    configure the firewall
    https://github.com/AnnieRuru/customs/blob/master/server hosting/32.png
    2. & 3. configure firewall only to this project
    https://github.com/AnnieRuru/customs/blob/master/server hosting/33.png
     
    4. at 'tcp:' tab, only allow these 3 ports
    https://github.com/AnnieRuru/customs/blob/master/server hosting/34.png
     
    7.4
    run ./athena-start start again.
    then goto https://portchecker.co/ and check your port is open
    https://github.com/AnnieRuru/customs/blob/master/server hosting/35.png
    And Finally go to your client edit data/sclientinfo.xml to the WAN IP and

    VIOLA !! DONE !!
    I can connect my client to google cloud
     
    PS: the port checker website only shows Port 6900 is OPEN. only if fulfill these 3 conditions
    1. enable firewall setting on CentOS
    2. enable firewall setting on Google Cloud
    3. run the emulator by ./athena-start
     
     
    Ok now you can start worry about security issue like adding additional user in CentOS
    https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-a-centos-7-server
    google cloud doesn't seem to allow login that way -> https://stackoverflow.com/questions/52503453/how-to-login-gcp-console-without-ssh
    and mysql root account password change ...
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234'; etc...etc...
    need more research
     
     
    Connect to MySQL in CentOS 8 using Window's MySQL Workbench
     
    1. add another connection
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql1.png
     
    2. under 'Connection Method', select 'Standard TCP/IP over SSH'
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql2.png
     
    3. configure these fields
    3.1 SSH hostname is the server IP address
    3.2 SSH username is the name you created with PuttyGen
    3.3 SSH keyfile needs a conversion with PuttyGen
    3.4 and Click [Test Connection]
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql3.png
     
    4. the SSH keyfile needs to be convert from PuttyGen
    4.1 load existing private key, in this case was 'annie.ppk'
    4.2 click conversion and save as 'annie' without file extension
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql4.png
     
    5. if successful it will show like this
    https://github.com/AnnieRuru/customs/blob/master/server hosting/mysql5.png
     
    then you can login into MySQL in CentOS
     
    did I forgot to mention needs to open the port 3306 in CentOS and Google Cloud ? refer back to step 7
     
    Reference: https://stackoverflow.com/questions/21527743/mysql-workbench-version-6-0-8-ssh-authentication-issue
     
     
    After thought :
    Overall I'm very satisfy with Google Cloud service,
    1. free $300 credit to spend
    2. can always register trash gmail account to make the credit infinite
      - of course the IP will always change if you do so
    3. very low latency from Malaysia connect to Singapore - just 30~40ms ping
     
    I haven't try OVH which everybody is recommending, but they doesn't offer immediate free credit for me to test so meh .....
     
    and I notice Hercules's wiki CentOS guide is broken, maybe I'll fix it
    https://github.com/HerculesWS/Hercules/wiki/Installation-(CentOS)
     
    - offtopic -
    over last few days playing with google cloud, when I visit Youtube, all my advertisement become Monday.com etc etc group project stuffs
    google really knows how to collect my data
  15. Like
    Caspian got a reaction from w0wZukuBg in [Showcase] Lhz Dun Mobs Update aka Bio Lab Family   
    Congratulations, I love your custom maps and all your work!
  16. Like
    Caspian got a reaction from MikZ in Null Returned   
    This is coming from Extended Battleground.
  17. Like
    Caspian reacted to SyncMaster in [Showcase] Jutsu - Kuchyiose Gojuu Rashomon   
    Summoning: Quintuple Rashōmon
    Summons five Rashōmon gates to block an incoming attack.
    Reference:
    Skill:
    https://streamable.com/o9gn67
    Skill : Gojuu Rashomon
    By: @SyncMaster e @NettHacker
    Bugs fixed by: @Zell
    3D Models by: @SyncMaster
  18. Like
    Caspian reacted to Rytech in The End of A Era - Goodbye 3CeAM   
    Well this is it. This is the day I knew would one day come after spending some time thinking about the project and my priorities. After a number of not so good things happened to me during the first few months of this year (2020) I had to sit down and think about many things including this project. In the end I came to the difficult decision of ending this project. Many many years of work into something that I feel has to end. But not every reason for this is due to my current situation in life but also the changing world of Ragnarok Online. I won't get into the details of whats going on in my personal life but ill talk about the issues with the project itself.
     
    RO is changing. A lot. Its changing too much for me to keep up on jobs, skills, and important features on the project and my life future needs to take priority. For most of the time I worked on this project it has distracted me from my priorities in life. I kept up with it for a very long time and I tried to catch up on things for many years. With the complete recode of the elemental system on r900 I felt I finally got all caught up and only had a few bugs here and there related to skills that needed to be fixed and I just needed to finish up whats missing for the Summoner job. But I was so wrong. The thing is I felt the need to keep things up to keep the project alive and not have people wondering if the project is dead or not. Plus after doing so much work it felt like ending it would mean I wasted years of my life doing this for....what??? What exactly did I get out of this? Some fun, a hand full of thanks, and some credits and rep. Kinda felt like someone who played a MMO for many years and can't quit knowing it would make all that past time feel like it was all for nothing. A waste.
     
    So whats the issues with the project itself? Well....
     
    1. The Base Code Is Too Old
    3CeAM is running on eAthena r14767 which is around 9 or 10 years old. A base that dated has been found to have some issues with newer compilers like VS 2015 which I have resolved this year. But other issues appeared after running the program made with newer compilers which I fixed some. But I realized that not only is there a lot of hidden issues needing fixing but things like plugin's and other .dll files are dated and need updating along with the code that uses them. I have little knowledge of this stuff and can't do it by myself. Other projects like rAthena and Hercules are much more up-to-date for newer compilers and OS's. 3CeAM's base code is just too old to keep up with. Especially when im the only one working on it.
     
     
     
    2. Keeping Things Up-To-Date Is Impossible
    When it comes to development in this project there's a few key things I focus on most. Jobs, skills, any systems related to the jobs/skills that require them, and client support. I don't bother with things like the banking system or equip swap or other non important things. This pile of stuff I pushed off grew over the years and now while client support is good, many features in them don't work since I never coded them in. Im always busy working on job/skill related stuff most of the time. Its very time consuming. But after spending many years catching up on the official support for skills and these job/skill related systems I finally caught up in r900 with the exception of Summoners and a few skills that could use a quick recode.
     
    Looking at whats been going on in official kRO the dev's have been changing things with the 3rd job skills....A LOT!!!! They will increase the max level for some of them, change how some of the skills work, and do these massive skill updates. That would be kinda fine with me if it wasn't for the fact that they keep changing things. How many skill updates Rune Knights got? How many freaken times Sonic Wave got changed? How many times did they change a large number of 3rd job skills for each job? Each job must of gotten at least 3 or 4 massive skill change updates to their skill set. Its enough to drive me crazy trying to keep up with it all.
     
    Remember how long it took me to go through every 3rd job a few years back to comb through all of the code to get each of them up-to-date with the 2011 skill updates? Even after that I had to go back and revisit the parts I held off on knowing they would be very complex and time consuming to do. Now it feels like half or most of what ive done was now a time waster since I will have to do this exact procedure ALL OVER AGAIN combing through the code and kRO change logs to update each 3rd job skills 1 by 1 to get them up-to-date again. I did it once, im not doing it again.
     
     
    3. Newer Client Support.
    In mid 2018 official kRO increased the value that handles item ID's from short (16-bit 32k item limit or 64k however you look at it) to int (32-bit allowing over 2 billion ID's). But the way they did it made things difficult. Many existing packets relays on item ID's and so they decided to change this value in all already existing packets. To support newer clients over 50 or probely 70 or 80 or maybe more needs updating. But not only updating but many which only have 1 versions of itself requires additional code to keep backward support for older clients. Such a change is a huge workload and would require multiple updates to get it working. Me not having the time for this crap if I did it would just say FUCK IT and remove ALL of those packets and only readd the latest versions of each one to significantly reduce that workload. I would make a copy of the source files that handles the packets and put them to the side in the SVN for those who want 2018-06-20 or older support because that change will make it so only 2018-07-01 and newer clients will work. Won't be the most popular choice but im not up for trying to keep backward compatibility with years of clients. Just going to be a pain in the ass.
     
     
     
    4. The 4th Jobs Workload
    It took many years since the beginning to get the 3rd jobs caught up. Some of that time spent figuring out how to implement them in the system on their own layer and also inherit the features and permissions of the previous jobs. That was a big challenge since noone knew exactly how the job management system worked. Me and a few others made multiple prototype codes to find the best method until I found the right way to do it. Knowing this knowledge I can create a new layer for 4th jobs. But these jobs come with a lot more then just a hand full of skill sets.
     
    When 3rd jobs came, so did the introduction of a new game mechanic that split cast times into variable cast and fixed cast and it also introduced cooldowns. It was a nice and much needed change and it didn't take long to code this stuff in. 4th jobs however are adding new game mechanics much bigger then this. When you change to a 4th job, level 201 to 250 will give you a new kind of stat points called T.Stats and you use them on 6 new stats that are added to the 6 that existed since day 1 of RO, making the total number of stats in the game 12 now. This also comes with a hand full of new sub-stats which we can just call T.Sub-Stats. Coding all of this in will be a big work load since no new stats were added since the early days of RO server emulators. Also new to the table is something called AP which will be a new requirement for some if not all of the 4th job skills according to info I found in a updated skillinfo_f.lua file. So now we will soon have to mange HP, SP, and now AP.
     
    Info extracted from newer client exe's shows some of the new buff skills increases T.Stats and also increases T.Sub-Stats. Combining that with the new AP requirements and you now have over 100 new skills that will require all of this to be coded in and working to allow those skills to work properly. This is a workload much MUCH greater then what the 3rd jobs were and doing this alone will just stress me out. Especially when this is only a free time hobby that brings no income.
     
     
     
    5. A Project Managed By 1 Person
    Managing the project by myself has been somewhat stressful at times. It used to be developed by a small team but everyone moved on with their lives. And I got used to doing it all by myself. I knew the code inside and out because almost everything was being done by me and I knew what was done and what still needed to be coded in. Well this became a big part of the project's downfall. Doing it all by myself is a lot on me and it prevented things like a updated base code and .dll's, server/client features, and other things to fall behind. Sure 15peaces made patches you can apply to get those other features working but its not something officially in the project's code.
     
    I tried working with the team at rAthena before only to quickly find out that some of the dev's there don't do a good job at coding. Some would code something in and commit it to the GIT and those changes would cause problems. So dev's have to go back and fix the bug or the issue which sometimes causes crashes and commit again. And even with that the fix won't even fix the issue as if the dev didn't test it. WTF!!??!! The dev would commit multiple times on that code before its actually working. I can only imagine the number of issues in that project's code. When you code something in your supposed to TEST IT BEFORE RELEASING IT!!!! Test it thoroughly to make sure it works EXACTLY how its supposed to and test some scenario with it to make sure it doesn't cause problems or crashes in case there's any hidden bugs. And even if it works properly, find ways to shrink the code down to make it smaller and optimize it to use a few CPU cycles and little memory as possible.
     
    I follow a procedure when I do my own coding. Code it in, do simple tests, shrink and optimize the code if it passes the test, test again for the same expected results, do extra testing (thorough testing through stressing the code and running scenarios that might cause issues), and then release it if all passes. Its because of this 3CeAM has a history of being stable and extremely rarely has any crashes or bugs. If there's one thing dev's should take from this example, do it right the first time and give it your best at all times. If your often having to go back to your previous work or the same piece of code repeatedly to fix it then your doing something wrong. The lack of this procedure in rAthena made me quit in less then a month as I refused to fix/cleanup other people's messes. This is why I worked alone for so long. I was afraid to let or ask others join the team.
     
     
     
    Final Note
    3CeAM was fun to work on and I learned a lot from it. It was very popular before rAthena and Hercules existed since at the time people wanted 3rd jobs in their servers. But those golden years are gone and trying to keep this project alive will just be a waste. Its time to let go and move on to new hobbies. Im very interested in the 4th jobs but im not interested in trying to code them into a old very dated project. If I do such a thing it will be in rAthena (which is in a better standing then when I saw it years ago), or Hercules. Anything with 3CeAM will only happen if its a paid job and thats if I even choose to accept it.
     
    Thank you to the community for supporting the project and being with me all these years. It was a fun journey.
  19. Like
    Caspian got a reaction from w0wZukuBg in [Showcase] Ice Twice Lake   
    Beautiful
  20. Like
    Caspian reacted to Tio Akima in Medieval Tavern - [FREE MAP]   
    View File Medieval Tavern - [FREE MAP]
    Hi.
    I am Tio Akima.
     
    This is one of my works in creating maps / graphs.
    Available to the community. (free)
     
    Medieval Tavern Map
    Map made in Browedit (Thanks Borf)
    3d models made in 3D Max

    Any error / bug let me know so I can fix it.
    Submitter Tio Akima Submitted 05/18/20 Category Maps & Textures  
  21. Like
    Caspian reacted to w0wZukuBg in [Showcase] Ice Twice Lake   
    A mysterious frozen lake in the midst of forests and mountains in the sunshine.
     
    .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.
    ice2xlake


     
     
    Please rate it  if the map is good enough
  22. Like
    Caspian reacted to SyncMaster in [Showcase] Skill Custom - Byakugan   
    Byakugan
     
    The player can move his field of vision around the map during the skill time.
    Players and mobs are shown in red and blue, respectively, on the minimap.
    Stronger enemies are shown with a darker shade (based on HP).
    Created by: @Lucas [Nett] e @SyncMaster
    Special Participation : @Falker, @Frost , @rapalooza, @Zell
    https://streamable.com/c0z3fy#
  23. Like
    Caspian reacted to Goldman in Put [ADM] or [GM] in characters Name with Square Brackets   
    Thanks, it works like a charm. 
     
    Question solved! 
  24. Like
    Caspian got a reaction from Goldman in Put [ADM] or [GM] in characters Name with Square Brackets   
    You have to chance your character's name in your database in the "char" table. Then your name will be changed in the game.
  25. Like
    Caspian reacted to Kenpachi in jRO Exclusive Monsters   
    View File jRO Exclusive Monsters
    All jRO Exclusive, Event and Special Episode monsters.
    This file was originally posted by @fxfreitas at Midgard-Community.
     
    The archive contains the following monster sprites:
    abyss_arthur (corridor of abyss special instance boss) AMELIT (ghost carring a gemstone) ANGLERFISH (Mini-boss) CHAOS_DEVIL_DRAGON deviruchi_w (a white deviruchi, event) domovoi (custom pet, based on RO2 domovoi) ECHIDNA EMELIT (ghost carring a gemstone) giant_deviruchi (event monster) giant_deviruchi_w (event monster) headless_mule (remake of original brasilis monster, last kRO already implemented) HERA (Episode Monster) j_taini (tiny, event monster and pet) kraken_baby (marse edit) LILITH (Episode Monster) M_DARK_KNIGHT (Mercenary monster) M_FLAME_KNIGHT (Mercenary monster) M_ICE_KNIGHT (Mercenary monster) M_LIGHT_KNIGHT (Mercenary monster) M_STONE_KNIGHT (Mercenary monster) merman_se (merman edit) METAL_DRAGON (Pet and dungeon monster) MYTHLIT (ghost carring a gemstone) pad_fafnir (Can't Move, Can't Attack) pad_helheim (Can't Move, Can't Attack) pad_horai (Can't Move, Can't Attack) pad_ifrit (Can't Move, Can't Attack) pad_kinggold (Can't Move, Can't Attack) pad_kingmetal (Can't Move, Can't Attack) pad_leviathan (Can't Move, Can't Attack) pad_muspelheim (Can't Move, Can't Attack) pad_mythlit (Can't Move, Can't Attack) pad_niraikanai (Can't Move, Can't Attack) pad_shangrila (Can't Move, Can't Attack) pad_tamadora (Pet) pad_zaerog (Can't Move, Can't Attack) pad_zerog (Can't Move, Can't Attack) poseidon (strouf edit) RUBYLIT (ghost carring a gemstone) SAPPHLIT (ghost carring a gemstone) seiren (obeaune edit) SIREN (Episode Monster) tacnu (Mini-boss) TOPALIT (ghost carring a gemstone) Submitter Kenpachi Submitted 04/22/20 Category Sprites & Palettes  
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.