Jump to content

J0k3r

Community
  • Content Count

    100
  • Joined

  • Last visited

  • Days Won

    10

J0k3r last won the day on May 16

J0k3r had the most liked content!

Community Reputation

45 Neutral

3 Followers

About J0k3r

  • Rank
    Pirate

Recent Profile Visitors

4,166 profile views
  1. Did you compile and update skilleff.txt/bin?
  2. replace this with this: 123 Stealth 1 9,10,12;10,10 it seems like you want it to work on the 15th slot, which doesn't come out of the box, you need to check for it separately. find cha_timer function inside function.lua & insert this. local emblemSlot = GetChaItem(role, 2, 14) local emblemID = GetItemID(emblemSlot) if (emblemID == 3086) then AddState(role, role, EMBLEM_STATE, 1, 5) else if GetChaStateLv(role, EMBLEM_STATE) ~= 0 then RemoveState(role, EMBLEM_STATE) end end in variables.lua add this EMBLEM_STATE = 240
  3. Sure, but returning false from there would cancel the attack, not just the auto attack which isn't the point, also for herbalists they learn the bolt skill before they get to 2nd adv classes. Note: i prefer switch statemens/enum classes, more control, more readable/reasonable code.
  4. Well to be honest I don't give a fuck about code optimization right there, also if they were really 2 lines why didn't u just write them? Or you're so desperate to show off about a game that's already dead with a community as good as you, if you know what i mean? Also i guess you don't understand english, I don't if i'm blind or making things up but i can't the "Is there a way" part, or is it a two word(s) question? Ohh, you just showed me how pathetic you really are, crying about you two lines? Don't want them shared? Are they gonna change the universe? Complaining about a leaked game? Alright, you can have copyrights for your brilliant code/ideas, here's a medal 🎖, & people wonder why the community is so toxic... Anyways I'm not bringing anymore drama with such a person, so it's the end of coversation. @MOD, just turn off further comments for already answered questions, we've had enough drama, i myself had enough fun today
  5. very informative answer, I think everybody is going to benefit from it, even I was inspired by it... If he had access to the client source "or" had the knowledge why would he bother asking to get such an answer? any ways cause you just inspired me, I'm posting this. Hey fella, open up "MouseDown.cpp" file and find the following functions CMouseDown::_AttackCha CMouseDown::_AttackArea add this on top of their body short nJob = pMain->getGameAttr()->get(ATTR_JOB); enum class rJob { Explorer = 4, Herbalist = 5, Cleric = 13, Sealmaster = 14, Voyager = 16, }; for _AttackCha replace the following: if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { if (_pAutoAttack->AttackStart(pMain, pSkill, pTarget)) return true; } with this: if( pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress() ) { switch (nJob) { case rJob::Explorer: // if you're using modern c++, you can add [[fallthrough]] for the rest of the cases case rJob::Herbalist: case rJob::Cleric: case rJob::Sealmaster: case rJob::Voyager: g_pGameApp->SysInfo("Autoattack is disabled for magic classes!"); break; default: if (_pAutoAttack->AttackStart(pMain, pSkill, pTarget)) return true; } } for _AttackArea replace the following: if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { if(_pAutoAttack->AttackStart(pMain, pSkill, nScrX, nScrY)) return true; } if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { switch (nJob) { case rJob::Explorer: case rJob::Herbalist: case rJob::Cleric: case rJob::Sealmaster: case rJob::Voyager: g_pGameApp->SysInfo("Autoattack is disabled for magic classes!"); break; default: if(_pAutoAttack->AttackStart(pMain, pSkill, nScrX, nScrY)) return true; } }
  6. use copy initialization or direct initialization, direct "list" initialization isn't supported before c++11 i believe short levelRequirement( (_ItemData.sNeedLv == 0) ? _pItem->sNeedLv : _ItemData.sNeedLv ); // direct initialization short levelRequirement = (_ItemData.sNeedLv == 0) ? _pItem->sNeedLv : _ItemData.sNeedLv; // copy initialization
  7. This was never a fix, unless you're not gonna use the "Item Deleveler". the issue is, the GameServer never sent the levelRequirement info, so its always set to 0, find & open up CharTrade.cpp then find the following function CTradeSystem::AddItem scroll down till u see this block:- SItemGrid* pGridCont = Bag.GetGridContByID( byItemIndex ); if( !pGridCont ) { pMain->SystemNotice( RES_STRING(GM_CHARSTALL_CPP_00057), byItemIndex ); return FALSE; } WRITE_SHORT( packet, pGridCont->sEndure[0] ); WRITE_SHORT( packet, pGridCont->sEndure[1] ); WRITE_SHORT( packet, pGridCont->sEnergy[0] ); WRITE_SHORT( packet, pGridCont->sEnergy[1] ); WRITE_CHAR( packet, pGridCont->chForgeLv ); WRITE_CHAR( packet, pGridCont->IsValid() ? 1 : 0 ); WRITE_LONG(packet, pGridCont->GetDBParam(enumITEMDBP_FORGE)); WRITE_LONG(packet, pGridCont->GetDBParam(enumITEMDBP_INST_ID)); insert this line WRITE_SHORT(packet, pGridCont->sNeedLv); now you're done with the Server part, now let's fix it in the Client as well? find & open up PacketCmd_SC.cpp then find the following function SC_CharTradeInfo find the following block Data.sEndure[0] = packet.ReadShort(); Data.sEndure[1] = packet.ReadShort(); Data.sEnergy[0] = packet.ReadShort(); Data.sEnergy[1] = packet.ReadShort(); Data.byForgeLv = packet.ReadChar(); Data.bValid = packet.ReadChar() != 0 ? true : false; Data.lDBParam[enumITEMDBP_FORGE] = packet.ReadLong(); Data.lDBParam[enumITEMDBP_INST_ID] = packet.ReadLong(); insert this line Data.levelRequirement = packet.ReadShort(); open up NetProtocol.h and find this struct _NET_CHARTRADE_ITEMDATA then add this member variable short levelRequirement; // levelRequirement open up NetProtocol.cpp and find the following function NetTradeAddItem add this line after Data.bValid sGrid.sNeedLv = Data.levelRequirement; finally, displaying the level requirement correctly? open up UIItemCommand.cpp and replace the line u replaced with these lines short levelRequirement{ (_ItemData.sNeedLv == 0) ? _pItem->sNeedLv : _ItemData.sNeedLv }; // if the levelRequirement is 0 means it has no data recorded from the server, means the item is on npc and not inside a player's inventory, then display the recorded levelRequirement from ItemInfo.txt PUSH_HINT(g_oLangRec.GetString(628), levelRequirement, (pAttr->get(ATTR_LV) >= levelRequirement) ? GENERIC_COLOR : VALID_COLOR); done. oh and by the way the stall has the same issue, now you can fix it on your own
  8. 1.3x game.exe uses StringSet.bin, to provide some "Client side" popups & system notices you just have to decompile it and recompile it using your game.exe whereas 2.x game.exe uses .res files for the same purpose but in a different approach & different encryption. again you just have to decompile, adjust what you want and recompile it you can find compilers and decompilers accordingly on the forum or on MEGA archive.
  9. for paypal its called IPN which is Instant paypal notifications , here is a reference:- https://developer.paypal.com/docs/api-basics/notifications/ipn/ht-ipn/# for other platforms/payment methods u'll have to check if they provide something similar or someway to check for successful payments.
  10. It doesn't achieve 100%, i thought that he wants the opposite.
  11. J0k3r

    Public IP DMZ

    use ur local ip addr as u are doing it locally for ur cfgs, and use 0.0.0.0 for gateserver.
  12. J0k3r

    Public IP DMZ

    gateserver accepts incoming connections if u specified anything rather than 0.0.0.0 which means accept all the ips which is going to try and connect to ur server, if u specified 127.0.0.1 u are telling ur gate to accept connection from ur local machine only.. this is not the perfect explanation but i hope u get it. and for ur client, u should use ur public ip addr
  13. J0k3r

    Public IP DMZ

    u should always use 0.0.0.0 in ur gateserver.cfg regardless what ur host is, whether its public or hamachi it always works with 0.0.0.0
×
×
  • Create New...