csnv
Members-
Content Count
35 -
Joined
-
Last visited
-
Days Won
4
csnv last won the day on August 5 2023
csnv had the most liked content!
About csnv
-
Rank
Advanced Member
Profile Information
-
Gender
Not Telling
-
Github
csnv
-
Emulator
Hercules
-
csnv reacted to a post in a topic: Large amount of material
-
Hello, this is the Hercules emulator. As you are trying to compile the rathena emulator, you'll have more luck in the rathena forums https://rathena.org/
-
I have never done anything like that, but I would say it needs both. Lua files required to put the skill in the correct position in the skill tree. Hardcoded to make plagiarized skills flagged as permanent instead, if that's what you want of course.
-
Bringer reacted to an answer to a question: How much does it cost to maintain a server in 2023?
-
How much does it cost to maintain a server in 2023?
csnv replied to Fou-lu's question in General Server Support
1- Gepard shield, by Functor. 2- Take this with a pinch of salt, but I'd say that as long as you have 3 cores available (1 for login/char, 1 for sql and 1 for map) it's enough for 100 people, as long as the CPU is powerful enough in single thread. So probably something cheap like 30 dollars/euro should suffice. -
IndieRO reacted to a post in a topic: csnv webtoken
-
View File csnv webtoken NOTE: THIS PLUGIN IS NO LONGER NECESSARY! API SERVER ALREADY MERGED Plugin required for generating webtokens for third party applications to serve the required web services for newer clients (2019-06+). Third party applications than can make use of webtokens generated by this plugin: https://github.com/csnv/Mindu [Tested] https://github.com/secretdataz/athena-web-service [Untested] Please report any issue in the github page https://github.com/csnv/webtoken Instructions: - Import login_webtoken_fields.sql into your SQL database. - Apply webtoken.diff to your Hercules server codebase. Alternatively, you may apply this PR: https://github.com/HerculesWS/Hercules/pull/3183 - Place csnv_webtoken.c in your src/plugins directory and compile. Now your hercules emulator generates the required webtoken. Pick a webserver application that can make use of it. Submitter csnv Submitted 12/30/22 Category Client Resources
-
Plugin for generating webtokens for third party applications to serve the required web services for newer clients (2019-06+). Third party applications than can make use of webtokens generated by this plugin: https://github.com/csnv/Mindu <- Plugin was tested under this webserver https://github.com/secretdataz/athena-web-service Please report any issue in the github page https://github.com/csnv/webtoken Instructions: - Import login_webtoken_fields.sql into your SQL database. - Apply webtoken.diff to your Hercules server codebase. Alternatively, you may apply this PR: https://github.com/HerculesWS/Hercules/pull/3183 - Place csnv_webtoken.c in your src/plugins directory and compile. Now your hercules emulator generates the required webtoken. Pick a webserver application that can make use of it. Plugin download:
-
https://github.com/HerculesWS/Hercules/issues/573
-
reds09 reacted to an answer to a question: [HELP] Custom skill that only work if an effect is active
-
[HELP] Custom skill that only work if an effect is active
csnv replied to reds09's question in Source Support
You are placing it in the wrong place. For SC statuses checks it goes under status_check_skilluse (status.c), right here https://github.com/HerculesWS/Hercules/blob/master/src/map/status.c#L1796 Turn this: if(tsc && tsc->count) { /* attacks in invincible are capped to 1 damage and handled in batte.c; allow spell break and eske for sealed shrine GDB when in INVINCIBLE state. */ if( tsc->data[SC_INVINCIBLE] && !tsc->data[SC_INVINCIBLEOFF] && skill_id && !(skill_id&(SA_SPELLBREAKER|SL_SKE)) ) return 0; if(!skill_id && tsc->data[SC_TRICKDEAD]) return 0; if((skill_id == WZ_STORMGUST || skill_id == WZ_FROSTNOVA || skill_id == NJ_HYOUSYOURAKU) && tsc->data[SC_FREEZE]) return 0; if(skill_id == PR_LEXAETERNA && (tsc->data[SC_FREEZE] || (tsc->data[SC_STONE] && tsc->opt1 == OPT1_STONE))) return 0; if( ( tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE] ) && !(st->mode&(MD_BOSS|MD_DETECTOR)) && flag == 4 ) return 0; } To this: if(tsc && tsc->count) { /* attacks in invincible are capped to 1 damage and handled in batte.c; allow spell break and eske for sealed shrine GDB when in INVINCIBLE state. */ if( tsc->data[SC_INVINCIBLE] && !tsc->data[SC_INVINCIBLEOFF] && skill_id && !(skill_id&(SA_SPELLBREAKER|SL_SKE)) ) return 0; if(!skill_id && tsc->data[SC_TRICKDEAD]) return 0; if((skill_id == WZ_STORMGUST || skill_id == WZ_FROSTNOVA || skill_id == NJ_HYOUSYOURAKU) && tsc->data[SC_FREEZE]) return 0; if(skill_id == PR_LEXAETERNA && (tsc->data[SC_FREEZE] || (tsc->data[SC_STONE] && tsc->opt1 == OPT1_STONE))) return 0; if( ( tsc->data[SC_STEALTHFIELD] || tsc->data[SC_CAMOUFLAGE] ) && !(st->mode&(MD_BOSS|MD_DETECTOR)) && flag == 4 ) return 0; if (skill_id == NG_JUTSU_FUNERAL && !(tsc->data[SC_STONE])) return 0; } -
reds09 reacted to an answer to a question: [HELP] Custom skill that only work if an effect is active
-
[HELP] Custom skill that only work if an effect is active
csnv replied to reds09's question in Source Support
You are checking the source's status. it should be like this: if(skill_id == NG_JUTSU_FUNERAL) { // Gravitation and Pressure do damage without removing the effect if(tsc && tsc->data[SC_STONE]){ damage <<= 1; // If used against a player in White Imprison, the skill deals double damage. }else{ d->dmg_lv = ATK_BLOCK; return 0; } } However, as the comment says, you're actually doubling damage if you keep it like this. So, for it doing exactly what you want it to do, it should be like this: if(skill_id == NG_JUTSU_FUNERAL && !(tsc && tsc->data[SC_STONE])) { // Deal damage only when the target is under stone curse status d->dmg_lv = ATK_BLOCK; return 0;} -
Rivalry and competition improve projects. This is specially true in open source projects, where one project can benefit from the other and viceversa. Just look how things were when there was "only" eathena (taking into account the community size difference), or where rAthena was alone in the path.
-
Update your hercules to last version.
-
For Blade Stop battle.c:5756 if( tsc && tsc->data[SC_BLADESTOP_WAIT] && !is_boss(src) && (src->type == BL_PC || tsd == NULL || distance_bl(src, target) <= (tsd->status.weapon == W_FIST ? 1 : 2)) ) change it to: if( tsc && tsc->data[SC_BLADESTOP_WAIT] && !is_boss(src) && flag&BF_SHORT && (src->type == BL_PC || tsd == NULL || distance_bl(src, target) <= (tsd->status.weapon == W_FIST ? 1 : 2)) ) The same with Shrink: battle.c:2746 if(sc->data[SC_CR_SHRINK] && rnd()%100<5*sce->val1) change to: if(sc->data[SC_CR_SHRINK] && flag&BF_SHORT && rnd()%100<5*sce->val1)
-
Windows doesn't have this problem because strcmpi is specific for Windows OSes. In Linux, those macros I posted is what is needed to use the POSIX versions. Post your cbasetypes.h
-
Try this on src/map/packets.h Look for: //2013-06-05Ragexe (Shakto)#if PACKETVER >= 20130605 packet(0x0369,7,clif->pActionRequest,2,6); packet(0x083C,10,clif->pUseSkillToId,2,4,6); packet(0x0437,5,clif->pWalkToXY,2); packet(0x035F,6,clif->pTickSend,2); packet(0x0202,5,clif->pChangeDir,2,4); packet(0x07E4,6,clif->pTakeItem,2); packet(0x0362,6,clif->pDropItem,2,4); packet(0x07EC,8,clif->pMoveToKafra,2,4); packet(0x0364,8,clif->pMoveFromKafra,2,4); packet(0x0438,10,clif->pUseSkillToPos,2,4,6,8); packet(0x0366,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); packet(0x096A,6,clif->pGetCharNameRequest,2); packet(0x0368,6,clif->pSolveCharName,2); packet(0x0838,12,clif->pSearchStoreInfoListItemClick,2,6,10); packet(0x0835,2,clif->pSearchStoreInfoNextPage,0); packet(0x0819,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); packet(0x0811,-1,clif->pReqTradeBuyingStore,2,4,8,12); packet(0x0360,6,clif->pReqClickBuyingStore,2); packet(0x0817,2,clif->pReqCloseBuyingStore,0); packet(0x0815,-1,clif->pReqOpenBuyingStore,2,4,8,9,89);#ifdef PACKETVER_RE packet(0x0365,41,clif->pPartyRecruitRegisterReq,2,4);#else // not PACKETVER_RE packet(0x0365,18,clif->pPartyBookingRegisterReq,2,4);#endif // PACKETVER_RE // packet(0x0363,8); // CZ_JOIN_BATTLE_FIELD packet(0x0281,-1,clif->pItemListWindowSelected,2,4,8); packet(0x022D,19,clif->pWantToConnection,2,6,10,14,18); packet(0x0802,26,clif->pPartyInvite2,2); // packet(0x0436,4); // CZ_GANGSI_RANK packet(0x023B,26,clif->pFriendsListAdd,2); packet(0x0361,5,clif->pHomMenu,2,4); packet(0x0883,36,clif->pStoragePassword,0);#endif Add this: packet(0x097C,4,clif->pRanklist); Before the last "#endif", like this: //2013-06-05Ragexe (Shakto)#if PACKETVER >= 20130605 packet(0x0369,7,clif->pActionRequest,2,6); packet(0x083C,10,clif->pUseSkillToId,2,4,6); packet(0x0437,5,clif->pWalkToXY,2); packet(0x035F,6,clif->pTickSend,2); packet(0x0202,5,clif->pChangeDir,2,4); packet(0x07E4,6,clif->pTakeItem,2); packet(0x0362,6,clif->pDropItem,2,4); packet(0x07EC,8,clif->pMoveToKafra,2,4); packet(0x0364,8,clif->pMoveFromKafra,2,4); packet(0x0438,10,clif->pUseSkillToPos,2,4,6,8); packet(0x0366,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); packet(0x096A,6,clif->pGetCharNameRequest,2); packet(0x0368,6,clif->pSolveCharName,2); packet(0x0838,12,clif->pSearchStoreInfoListItemClick,2,6,10); packet(0x0835,2,clif->pSearchStoreInfoNextPage,0); packet(0x0819,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); packet(0x0811,-1,clif->pReqTradeBuyingStore,2,4,8,12); packet(0x0360,6,clif->pReqClickBuyingStore,2); packet(0x0817,2,clif->pReqCloseBuyingStore,0); packet(0x0815,-1,clif->pReqOpenBuyingStore,2,4,8,9,89);#ifdef PACKETVER_RE packet(0x0365,41,clif->pPartyRecruitRegisterReq,2,4);#else // not PACKETVER_RE packet(0x0365,18,clif->pPartyBookingRegisterReq,2,4);#endif // PACKETVER_RE // packet(0x0363,8); // CZ_JOIN_BATTLE_FIELD packet(0x0281,-1,clif->pItemListWindowSelected,2,4,8); packet(0x022D,19,clif->pWantToConnection,2,6,10,14,18); packet(0x0802,26,clif->pPartyInvite2,2); // packet(0x0436,4); // CZ_GANGSI_RANK packet(0x023B,26,clif->pFriendsListAdd,2); packet(0x0361,5,clif->pHomMenu,2,4); packet(0x0883,36,clif->pStoragePassword,0); packet(0x097C,4,clif->pRanklist);#endif And then, recompile. If it works please notify it so we add the fix upstream
-
You could, but that's something that should be there since the old eathena days. I suggest you to work with a clean copy of Hercules to avoid other errors.
-
Try this (remember that Hercules uses interfaces and script.c is a bit different) BUILDIN(partyinvite){ int party_id,i = 0; struct map_session_data *sd = script_rid2sd(st ); struct party_data *p; party_id=script_getnum(st,2); p = party->search(party_id); if (p ) //Search leader for(i = 0; i < MAX_PARTY && !p->party.member->leader; i++); if (!p || i == MAX_PARTY) return 0; //leader not found if(!sd) return 0; //no players in the script sd->party_joining = 1; sd->party_invite = party_id; sd->party_invite_account = p->party.member[i].account_id; if( party->member_added(party_id,sd->status.account_id,sd->status.char_id,0) ) script_pushint(st,1); else script_pushint(st,-1); return true;}