-
Content Count
556 -
Joined
-
Last visited
About ThyroDree
-
Rank
Advanced Member
Profile Information
-
Gender
Not Telling
-
Location:
Philippines
-
Github
bosxkate23
-
Emulator
Hercules
Recent Profile Visitors
4861 profile views
-
Hi, do I need to disable the official summon quest script before using this script? I think using this with official thanatos quest is not connected,
-
ThyroDree reacted to a post in a topic: Daily Rewards
-
up anyone 😕
-
ThyroDree started following Outdated: (Errors) Soul Link Strip Bypass by Dastgir, Hiding monster info from @mobinfo/@mi commands, Help modify @pk source patch and and 5 others
-
Hiding monster info from @mobinfo/@mi commands
ThyroDree posted a question in General Server Support
Is there a possible way of hiding certain monster from getting its information? For example I have a custom mob "God Poring" which is Angel Type Monster, Large Size Mob.. I wanted to make it not accessible for players to @mobinfo/@mi "God Poring".. Instead of God poring will sshow its info it will show @mi failed. -
Hello, I have used the @pk source patch since Dastgir pk plugin isn't working on me.. Can anyone help me make modify the command line when using @pk? I wanted to make it @pk <on/off> features not only @pk only itself no Toggle ON / OFF.. I will attach the file patch. pk.patch
-
Thank you! It works
-
ThyroDree reacted to an answer to a question: Euphy's Quest Shop Help with Preview
-
How can I enable the preview item of quest item? It's not showing the Preview Case //===== rAthena Script ======================================= //= Euphy's Quest Shop //===== By: ================================================== //= Euphy //===== Current Version: ===================================== //= 1.6b //===== Compatible With: ===================================== //= rAthena SVN r16862+ //===== Description: ========================================= //= A dynamic quest shop based on Lunar's, with easier config. //= Includes support for multiple shops & cashpoints. //= Item Preview script by ToastOfDoom. //===== Additional Comments: ================================= //= 1.0 Initial script. //= 1.2 Added category support. //= 1.3 More options and fixes. //= 1.4 Added debug settings. //= 1.5 Replaced categories with shop IDs. //= 1.6 Added support for purchasing stackables. //= 1.6a Added support for previewing costumes and robes. //= 1.6b Added 'disable_items' command. //============================================================ // Shop NPCs -- supplying no argument displays entire menu. // callfunc "qshop"{,<shop ID>{,<shop ID>{,...}}}; //============================================================ mall,100,120,4 script Headgear Quest Shop#4 4_MAL_SOLDIER,{ callfunc "oshop1"; OnInit: // waitingroom "Quest",0; end; } // Script Core //============================================================ - script offquest_shop FAKE_NPC,{ function Add; function Chk; function Slot; function A_An; OnInit: freeloop(1); // ----------------------------------------------------------- // Basic shop settings. // ----------------------------------------------------------- set .announce,0; // Announce quest completion? (1: yes / 0: no) set .ShowSlot,1; // Show item slots? (2: all equipment / 1: if slots > 0 / 0: never) set .ShowID,1; // Show item IDs? (1: yes / 0: no) set .ShowZeny,0; // Show Zeny cost, if any? (1: yes / 0: no) set .MaxStack,100; // Max number of quest items purchased at one time. // ----------------------------------------------------------- // Points variable -- optional quest requirement. // setarray .Points$[0],"<variable name>","<display name>"; // ----------------------------------------------------------- setarray .Points$[0],"#CASHPOINTS","Cash Points"; // ----------------------------------------------------------- // Shop IDs -- to add shops, copy dummy data at bottom of file. // setarray .Shops$[1],"<Shop 1>","<Shop 2>"{,...}; // ----------------------------------------------------------- setarray .Shops$[1],"Upper Gear","Middle Gear"; // ----------------------------------------------------------- // Quest items -- do NOT use a reward item more than once! // Add(<shop ID>,<reward ID>,<reward amount>, // <Zeny cost>,<point cost>, // <required item ID>,<required item amount>{,...}); // ----------------------------------------------------------- //---------- Upper Add(1,2284,1,0,0,923,20); Add(1,5076,1,0,0,2227,1,7038,500); Add(1,5199,1,0,0,2227,1,978,1,1057,100); Add(1,5057,1,10000,0,2213,1,983,1,914,200); Add(1,5065,1,0,0,624,1,959,500,1023,1); Add(1,5016,1,0,0,1030,10,0,0,0,0,0,0); Add(1,2214,1,0,0,949,100,706,1,722,1,2213,1); Add(1,5026,1,0,0,1036,450,949,330,539,120,982,1); Add(1,5108,1,5000,0,7301,500,611,10); Add(1,5038,1,0,0,1038,600,7048,40); Add(1,5258,1,0,0,914,100,975,1,976,1,978,1); Add(1,5058,1,0,0,2233,1,983,1,7206,300,7030,1); Add(1,5205,1,0,0,610,100,706,25,7194,300); // Add(1,5427,1,0,0,5288,1,12078,1,7521,1,12183,1); // Add(1,5188,1,0,0,5027,1,7166,50,7064,1); // Add(1,5426,1,0,0,5027,1,976,5); Add(1,5001,1,0,0,999,40,984,1,970,1,1003,1); Add(1,5070,1,0,0,7216,300,7097,300,2211,1,982,1); Add(1,5069,1,0,0,1022,99); Add(1,5027,1,0,0,2252,1,1036,400,7001,50,4052,1); Add(1,2280,1,10000,0,1019,120); Add(1,5062,1,0,0,2280,1,7197,300,7150,300); Add(1,5121,1,0,0,7263,1,660,1,7099,30,7315,369); //---------- Middle Add(2,5074,1,20000,0,2286,1,2254,1); Add(2,5068,1,20000,0,2255,1,2286,1); Add(2,2296,1,50000,0,999,100); Add(2,5040,1,0,0,7047,100); Add(2,5175,1,100000,0,7111,100,938,99,983,1); Add(2,2281,1,5000,0,998,20,707,1); Add(2,5043,1,0,0,2281,1,1048,50); Add(2,2202,1,0,0,7020,2,999,100); // ----------------------------------------------------------- freeloop(0); set .menu$,""; for(set .@i,1; .@i<=getarraysize(.Shops$); set .@i,.@i+1) { set .menu$, .menu$+.Shops$[.@i]+":"; npcshopdelitem "oshop"+.@i,909; } end; OnMenu: set .@size, getarraysize(@i); if (!.@size) set .@i, select(.menu$); else if (.@size == 1) set .@i, @i[0]; else { for(set .@j,0; .@j<.@size; set .@j,.@j+1) set .@menu$, .@menu$+.Shops$[@i[.@j]]+":"; set .@i, @i[select(.@menu$)-1]; } deletearray @i[0],getarraysize(@i); if (.Shops$[.@i] == "") { message strcharinfo(0),"An error has occurred."; end; } dispbottom "Select one item at a time."; callshop "oshop"+.@i,1; npcshopattach "oshop"+.@i; end; OnBuyItem: // .@q[] : RewardID, BoughtAmt, RewardAmt, BaseAmt, ReqZeny, ReqPts, { ReqItem, ReqAmt, ... } setarray .@q[0],@bought_nameid[0],((@bought_quantity[0] > .MaxStack)?.MaxStack:@bought_quantity[0]); copyarray .@q[3],getd(".q_"+.@q[0]+"[0]"),getarraysize(getd(".q_"+.@q[0])); set .@q[2],.@q[1]*.@q[3]; if (!.@q[2] || .@q[2] > 30000) { message strcharinfo(0),"You can't purchase that many "+getitemname(.@q[0])+"."; end; } mes "[Quest Shop]"; mes "Reward: ^0055FF"+((.@q[2] > 1)?.@q[2]+"x ":"")+Slot(.@q[0])+"^000000"; mes "Requirements:"; disable_items; if (.@q[4]) mes " > "+Chk(Zeny,.@q[4]*.@q[1])+(.@q[4]*.@q[1])+" Zeny^000000"; if (.@q[5]) mes " > "+Chk(getd(.Points$[0]),.@q[5]*.@q[1])+(.@q[5]*.@q[1])+" "+.Points$[1]+" ("+getd(.Points$[0])+"/"+(.@q[5]*.@q[1])+")^000000"; if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) mes " > "+Chk(countitem(.@q[.@i]),.@q[.@i+1]*.@q[1])+((.ShowID)?"{"+.@q[.@i]+"} ":"")+Slot(.@q[.@i])+" ("+countitem(.@q[.@i])+"/"+(.@q[.@i+1]*.@q[1])+")^000000"; next; setarray @qe[1], getiteminfo(.@q[0],5), getiteminfo(.@q[0],11); if (@qe[2] > 0 && ((@qe[1] & 1) || (@qe[1] & 256) || (@qe[1] & 512) || (@qe[1] & 1024) || (@qe[1] & 2048) || (@qe[1] & 4096) || (@qe[1] & 4) || (@qe[1] & 8192))) set .@preview,1; addtimer 1000, strnpcinfo(0)+"::OnEnd"; while(1) { switch(select(" ~ Purchase ^0055FF"+getitemname(.@q[0])+"^000000:"+((.@preview && !@qe[7])?" ~ Preview...":"")+": ~ ^777777Cancel^000000")) { case 1: if (@qe[0]) { mes "[Quest Shop]"; mes "You're missing one or more quest requirements."; close; } if (!checkweight(.@q[0],.@q[2])) { mes "[Quest Shop]"; mes "^FF0000You need "+(((.@q[2]*getiteminfo(.@q[0],6))+Weight-MaxWeight)/10)+" additional weight capacity to complete this trade.^000000"; close; } if (.@q[4]) set Zeny, Zeny-(.@q[4]*.@q[1]); if (.@q[5]) setd .Points$[0], getd(.Points$[0])-(.@q[5]*.@q[1]); if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) delitem .@q[.@i],.@q[.@i+1]*.@q[1]; getitem .@q[0],.@q[2]; if (.announce) announce strcharinfo(0)+" has created "+((.@q[2] > 1)?.@q[2]+"x "+getitemname(.@q[0]):A_An(getitemname(.@q[0])))+"!",0,0xFF6060; // f87e7b; specialeffect EF_FLOWERLEAF; close; case 2: setarray @qe[3], getlook(LOOK_HEAD_BOTTOM), getlook(LOOK_HEAD_TOP), getlook(LOOK_HEAD_MID), getlook(LOOK_ROBE), 1; if ((@qe[1] & 1) || (@qe[1] & 4096)) changelook LOOK_HEAD_BOTTOM, @qe[2]; else if ((@qe[1] & 256) || (@qe[1] & 1024)) changelook LOOK_HEAD_TOP, @qe[2]; else if ((@qe[1] & 512) || (@qe[1] & 2048)) changelook LOOK_HEAD_MID, @qe[2]; else if ((@qe[1] & 4) || (@qe[1] & 8192)) changelook LOOK_ROBE, @qe[2]; break; case 3: close; } } OnEnd: if (@qe[7]) { changelook LOOK_HEAD_BOTTOM, @qe[3]; changelook LOOK_HEAD_TOP, @qe[4]; changelook LOOK_HEAD_MID, @qe[5]; changelook LOOK_ROBE, @qe[6]; } deletearray @qe[0],8; end; function Add { if (getitemname(getarg(1)) == "null") { consolemes(CONSOLEMES_DEBUG, "Quest reward #"+getarg(1)+" invalid (skipped)."); return; } setarray .@j[0],getarg(2),getarg(3),getarg(4); for(set .@i,5; .@i<getargcount(); set .@i,.@i+2) { if (getitemname(getarg(.@i)) == "null") { consolemes(CONSOLEMES_DEBUG, "Quest requirement #"+getarg(.@i)+" invalid (skipped)."); return; } else setarray .@j[.@i-2],getarg(.@i),getarg(.@i+1); } copyarray getd(".q_"+getarg(1)+"[0]"),.@j[0],getarraysize(.@j); npcshopadditem "oshop"+getarg(0),getarg(1),((.ShowZeny)?getarg(3):0); return; } function Chk { if (getarg(0) < getarg(1)) { set @qe[0],1; return "^FF0000"; } else return "^00FF00"; } function Slot { set .@s$,getitemname(getarg(0)); switch(.ShowSlot) { case 1: if (!getitemslots(getarg(0))) return .@s$; case 2: if (getiteminfo(getarg(0),2) == 4 || getiteminfo(getarg(0),2) == 5) return .@s$+" ["+getitemslots(getarg(0))+"]"; default: return .@s$; } } function A_An { setarray .@A$[0],"a","e","i","o","u"; set .@B$, "_"+getarg(0); for(set .@i,0; .@i<5; set .@i,.@i+1) if (compare(.@B$,"_"+.@A$[.@i])) return "an "+getarg(0); return "a "+getarg(0); } } function script oshop1 { deletearray @i[0],getarraysize(@i); for(set .@i,0; .@i<getargcount(); set .@i,.@i+1) set @i[.@i],getarg(.@i); doevent "offquest_shop::OnMenu"; end; } // Dummy shop data -- copy as needed. //============================================================ - shop oshop1 FAKE_NPC,909:-1 - shop oshop2 FAKE_NPC,909:-1
-
Help on Ankle Snare, Spider Web skill small changes
ThyroDree replied to ThyroDree's question in General Server Support
Up, anyone can help making spider web works like sniper trap (Ankle Snares, etc.,) -
Help on Ankle Snare, Spider Web skill small changes
ThyroDree replied to ThyroDree's question in General Server Support
What do you mean sir? Can you provide sample, I tried it on body reloc, ankle snare works but spider web you can still use body relocation -
ThyroDree reacted to an answer to a question: Atcommand.c remove warning message when compiling
-
Atcommand.c remove warning message when compiling
ThyroDree replied to ThyroDree's question in Source Support
Thank you, it works! -
Anyone can help me fix this warning showing on my atcommand.c when compiling? atcommand.c: In function ‘atcommand_pk’: ../common/nullpo.h:69:23: warning: nonnull argument ‘sd’ compared to NULL [-Wnonnull-compare] #define nullpo_chk(t) ( (t) != NULL ? false : (nullpo->assert_report(__FILE__, __LINE__, __func__, #t, "nullpo info"), true) ) ^ ../common/nullpo.h:124:11: note: in expansion of macro ‘nullpo_chk’ do { if (nullpo_chk(t)) return(ret); } while(0) ^~~~~~~~~~ atcommand.c:9732:2: note: in expansion of macro ‘nullpo_retr’ nullpo_retr(-1, sd); ^~~~~~~~~~~ This warning shows after I added a source mod of PK which is this lines.. +ACMD(pk) { + + int64 tick = timer->gettick(); + + nullpo_retr(-1, sd); + + if( map->list[sd->bl.m].flag.pvp || map->list[sd->bl.m].flag.gvg || map->list[sd->bl.m].flag.gvg_castle || map->list[sd->bl.m].flag.gvg_castle || map->list[sd->bl.m].flag.battleground ) { + clif->message(sd->fd, "You can only change your PK state on non-PVP maps."); + return false; + } + + if(DIFF_TICK(sd->pk_mode_tick,tick) > 0){ //check the delay before use this command again + clif->message(sd->fd, "You can turn OFF your PK state after 3 minutes."); + return false; + } + else { + if (!sd->state.pk_mode) { + sd->state.pk_mode = 1; + clif->message(sd->fd, "Your PK state is now OFF"); + sd->pk_mode_tick = tick + 0; //set the delay here + } else { + sd->state.pk_mode = 0; + clif->message(sd->fd, "Your PK state is now ON"); + sd->pk_mode_tick = tick + 300000; //set the delay here + } + } + return true; +} +
-
Help on Ankle Snare, Spider Web skill small changes
ThyroDree posted a question in General Server Support
How can I make Charge Attack, Body Relocation,Back Sliding, Flying Side Kick, High Jump, Shadow Jump fail when they are trapped in Spider Web and Ankle Snare? I tried on body relocation by adding this lines, The anklesnare skill fail when body reloacating works but the spider web skill fail wont work. I can still body reloc. // Block skill usage while you have SC_SPIDERWEB AND ANKLESNARE status if(sc && (sc->data[SC_SPIDERWEB] || sc->data[SC_ANKLESNARE])) break; Also How can i make the Spider Web works like Ankle snare trap by placing on floors not casting on player. -
ThyroDree reacted to an answer to a question: Item Shower around player
-
Hi, did you tried pk by dastgir using latest hercules? Same problem as mine, Compiling has no errors but when you toggle PK ON on both character they cant attack each other (Normal Attack or Skill) - This is when PK mode on misc.conf is disabled. But I also tried to Enable PK mode on misc.conf, and use dastgir PK plugin. Toggling ON makes both player attack each other but when both or one of character toggle PK OFF. They can still hit each other. Seems the PK plugin by dastgir wont work on my latest herc.
- 8 replies
-
- source
- source mod
-
(and 3 more)
Tagged with:
-
ThyroDree reacted to a post in a topic: Plugin Collections
-
Can we request for update of PK, Warp-Delay and FCP-Bypass plugins? It will be a great to have this plugins again sir @Dastgir
-
Hi anyone can update on this? This is way back 2018,\ Anyone can update this plugin? I have working plugin with no errors but the problem is It doesnt change the status of player (PK ON / OFF) It will be a great help for us using Herc Plugin features, but this is outdated and needs to fix. //===== Hercules Plugin ====================================== //= @pk command //===== By: ================================================== //= AnnieRuru (v1.1) //===== Modified By: ========================================= //= Dastgir //===== Current Version: ===================================== //= v1.3 //===== Compatible With: ===================================== //= Hercules //===== Description: ========================================= //= PK Mode //===== Topic ================================================ //= http://herc.ws/board/topic/11004-/ //============================================================ #include "common/hercules.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include "map/atcommand.h" #include "map/battle.h" #include "map/clif.h" #include "map/map.h" #include "map/pc.h" #include "common/memmgr.h" #include "plugins/HPMHooking.h" #include "common/HPMDataCheck.h" HPExport struct hplugin_info pinfo = { "@pk", SERVER_TYPE_MAP, "1.3", HPM_VERSION, }; // bitwise checking enum { PK_ENABLE_TOWN = 1, PK_ENABLE_OTHER = 2, PK_ENABLE_ALL = 3, }; int config_delay = 5; // After turn pk on/off, how many seconds delay before the player allow to pk on/off ? // maps where @pk command can be used int enable_maps = PK_ENABLE_TOWN; // Which map player can actually pk int pk_maps = PK_ENABLE_ALL; struct player_data { unsigned int pkmode :1; int pkmode_delay; }; ACMD(pk) { struct player_data *ssd; char output[CHAT_SIZE_MAX]; if (!( ssd = getFromMSD(sd,0))) { CREATE(ssd, struct player_data, 1); ssd->pkmode = 0; addToMSD(sd, ssd, 0, true); } if ((enable_maps&PK_ENABLE_ALL) == 0 && (enable_maps&PK_ENABLE_TOWN) > 0 && !map->list[sd->bl.m].flag.town) { clif->message(sd->fd, "You can only change your PK state in towns."); return false; } if ((enable_maps&PK_ENABLE_ALL) == 0 && (enable_maps&PK_ENABLE_OTHER) > 0 && map->list[sd->bl.m].flag.town) { clif->message(sd->fd, "You cannot change your PK state in towns."); return false; } if (ssd->pkmode_delay + config_delay > (int)time(NULL)) { safesnprintf(output, CHAT_SIZE_MAX, "You must wait %d seconds before using this command again.", ssd->pkmode_delay + config_delay - (int)time(NULL)); clif->message(sd->fd, output); return false; } if (ssd->pkmode == 0) { ssd->pkmode = 1; clif->message(sd->fd, "Your PK state is now ON"); } else { ssd->pkmode = 0; clif->message(sd->fd, "Your PK state is now OFF"); } ssd->pkmode_delay = (int)time(NULL); return true; } int battle_check_target_post(int retVal, struct block_list *src, struct block_list *target, int flag) { if (retVal != 1 && src->type == BL_PC && target->type == BL_PC) { struct map_session_data *sd = BL_CAST(BL_PC, src); struct map_session_data *targetsd = BL_CAST(BL_PC, target); if ((pk_maps&PK_ENABLE_TOWN && map->list[sd->bl.m].flag.town) || (pk_maps&PK_ENABLE_OTHER && map->list[sd->bl.m].flag.town)) { if (sd->status.account_id != targetsd->status.account_id) { struct player_data *src_pc = getFromMSD(sd, 0); struct player_data *target_pc = getFromMSD(targetsd, 0); if (src_pc != NULL && target_pc != NULL && src_pc->pkmode && target_pc->pkmode) { hookStop(); return 1; } } } } return retVal; } HPExport void plugin_init(void) { addAtcommand("pk", pk); addHookPost(battle, check_target, battle_check_target_post); } HPExport void server_online(void) { ShowInfo("'%s' Plugin by Dastgir/Hercules. Version '%s'\n", pinfo.name, pinfo.version); }
-
Heres the script //===== Hercules Plugin ====================================== //= Soul Link Boost: Single Strip bypass FCP //===== By: ================================================== //= Dastgir/Hercules //===== Current Version: ===================================== //= 1.0 //===== Description: ========================================= //= Related Topic: //= http://herc.ws/board/files/file/177-soul-link-boost-single-strip-bypass-fcp/ //===== Changelog: =========================================== //= v1.0 - Initial Release. //===== Repo Link: =========================================== //= https://github.com/dastgir/HPM-Plugins //============================================================ #include "common/hercules.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include "common/HPMi.h" #include "common/memmgr.h" #include "common/mmo.h" #include "common/nullpo.h" #include "common/strlib.h" #include "common/timer.h" #include "map/battle.h" #include "map/clif.h" #include "map/guild.h" #include "map/map.h" #include "map/mob.h" #include "map/party.h" #include "map/pc.h" #include "map/skill.h" #include "map/status.h" #include "plugins/HPMHooking.h" #include "common/HPMDataCheck.h" HPExport struct hplugin_info pinfo = { "SoulLink Boost(FCP Bypass)", SERVER_TYPE_MAP, "1.0", HPM_VERSION, }; int skill_castend_nodamage_id_pre(struct block_list **src_, struct block_list **bl_, uint16 *skill_id_, uint16 *skill_lv_, int64 *tick_, int *flag_) { struct map_session_data *sd, *dstsd; struct mob_data *dstmd; struct status_data *sstatus, *tstatus; struct status_change *tsc; bool hookS = false; struct block_list *src = *src_, *bl = *bl_; uint16 skill_id = *skill_id_, skill_lv = *skill_lv_; int64 tick = *tick_; int flag = *flag_; int element = 0; enum sc_type type; if(skill_id > 0 && !skill_lv) return 0; // [Celest] nullpo_retr(1, src); nullpo_retr(1, bl); if (src->m != bl->m) return 1; sd = BL_CAST(BL_PC, src); dstsd = BL_CAST(BL_PC, bl); dstmd = BL_CAST(BL_MOB, bl); if(bl->prev == NULL) return 1; if(status->isdead(src)) { return 1; } switch (skill_id) { case RG_STRIPWEAPON: case RG_STRIPSHIELD: case RG_STRIPARMOR: case RG_STRIPHELM: case ST_FULLSTRIP: case GC_WEAPONCRUSH: case SC_STRIPACCESSARY: hookS = true; break; default: return 0; } if (src != bl && status->isdead(bl)) if (skill->castend_nodamage_id_dead_unknown(src, bl, &skill_id, &skill_lv, &tick, &flag)) return 1; // Supportive skills that can't be cast in users with mado if (sd && dstsd && pc_ismadogear(dstsd)) { if (skill->castend_nodamage_id_mado_unknown(src, bl, &skill_id, &skill_lv, &tick, &flag)) return 0; } tstatus = status->get_status_data(bl); sstatus = status->get_status_data(src); type = status->skill2sc(skill_id); tsc = status->get_sc(bl); if (src != bl && type > SC_NONE && (element = skill->get_ele(skill_id, skill_lv)) > ELE_NEUTRAL && skill->get_inf(skill_id) != INF_SUPPORT_SKILL && battle->attr_fix(NULL, NULL, 100, element, tstatus->def_ele, tstatus->ele_lv) <= 0) return 1; //Skills that cause an status should be blocked if the target element blocks its element. map->freeblock_lock(); switch (skill_id) { case RG_STRIPWEAPON: case RG_STRIPSHIELD: case RG_STRIPARMOR: case RG_STRIPHELM: case ST_FULLSTRIP: case GC_WEAPONCRUSH: case SC_STRIPACCESSARY: { unsigned short location = 0; int d = 0, rate; //Rate in percent if (skill_id == ST_FULLSTRIP) rate = 5 + 2*skill_lv + (sstatus->dex - tstatus->dex)/5; else if (skill_id == SC_STRIPACCESSARY) rate = 12 + 2 * skill_lv + (sstatus->dex - tstatus->dex)/5; else rate = 5 + 5*skill_lv + (sstatus->dex - tstatus->dex)/5; if (rate < 5) rate = 5; //Minimum rate 5% //Duration in ms if (skill_id == GC_WEAPONCRUSH) { d = skill->get_time(skill_id,skill_lv); if (bl->type == BL_PC) d += 1000 * ( skill_lv * 15 + ( sstatus->dex - tstatus->dex ) ); else d += 1000 * ( skill_lv * 30 + ( sstatus->dex - tstatus->dex ) / 2 ); } else d = skill->get_time(skill_id,skill_lv) + (sstatus->dex - tstatus->dex)*500; if (d < 0) d = 0; // Minimum duration 0ms switch (skill_id) { case RG_STRIPWEAPON: case GC_WEAPONCRUSH: location = EQP_WEAPON; break; case RG_STRIPSHIELD: location = EQP_SHIELD; break; case RG_STRIPARMOR: location = EQP_ARMOR; break; case RG_STRIPHELM: location = EQP_HELM; break; case ST_FULLSTRIP: location = EQP_WEAPON|EQP_SHIELD|EQP_ARMOR|EQP_HELM; break; case SC_STRIPACCESSARY: location = EQP_ACC; break; } //Special message when trying to use strip on FCP [Jobbie] if (sd && skill_id == ST_FULLSTRIP && tsc && tsc->data[SC_PROTECTWEAPON] && tsc->data[SC_PROTECTHELM] && tsc->data[SC_PROTECTARMOR] && tsc->data[SC_PROTECTSHIELD]) { clif->gospel_info(sd, 0x28); break; } // FCP // By pass FCP when using single strip skills by 15%(requires Glistening Coat). if (sd && tsc && sd->sc.data[SC_SOULLINK] && sd->sc.data[SC_SOULLINK]->val2 == SL_ROGUE && rand()%100 < 15 && ((skill_id == RG_STRIPWEAPON && tsc->data[SC_PROTECTWEAPON]) || (skill_id == RG_STRIPSHIELD && tsc->data[SC_PROTECTSHIELD]) || (skill_id == RG_STRIPARMOR && tsc->data[SC_PROTECTARMOR]) || (skill_id == RG_STRIPHELM && tsc->data[SC_PROTECTHELM])) ) { int item_id = 7139; // Glistening Coat int ii; ARR_FIND(0, MAX_INVENTORY, ii, sd->status.inventory[ii].nameid == item_id); if (ii < MAX_INVENTORY) { pc->delitem(sd, ii, 1, 0, 0, LOG_TYPE_CONSUME); switch (skill_id) { case RG_STRIPWEAPON: status_change_end(bl, SC_PROTECTWEAPON, INVALID_TIMER); sc_start(NULL, bl, SC_NOEQUIPWEAPON, 100, skill_lv, d); break; case RG_STRIPSHIELD: status_change_end(bl, SC_PROTECTSHIELD, INVALID_TIMER); sc_start(NULL, bl, SC_NOEQUIPSHIELD, 100, skill_lv, d); break; case RG_STRIPARMOR: status_change_end(bl, SC_PROTECTARMOR, INVALID_TIMER ); sc_start(NULL, bl, SC_NOEQUIPARMOR, 100, skill_lv, d); break; case RG_STRIPHELM: status_change_end(bl, SC_PROTECTHELM, INVALID_TIMER ); sc_start(NULL, bl, SC_NOEQUIPHELM, 100, skill_lv, d); break; } clif->skill_nodamage(src,bl,skill_id,skill_lv,1); break; } } // Attempts to strip at rate i and duration d if ((rate = skill->strip_equip(bl, location, rate, skill_lv, d)) || (skill_id != ST_FULLSTRIP && skill_id != GC_WEAPONCRUSH)) clif->skill_nodamage(src,bl,skill_id,skill_lv,rate); // Nothing stripped. if (sd && !rate){ int item_id = 7139; // Glistening Coat int ii; ARR_FIND(0, MAX_INVENTORY, ii, sd->status.inventory[ii].nameid == item_id); if (ii < MAX_INVENTORY) { pc->delitem(sd, ii, 1, 0, 0, LOG_TYPE_CONSUME); } clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } break; } } if (skill_id != SR_CURSEDCIRCLE) { struct status_change *sc = status->get_sc(src); if( sc && sc->data[SC_CURSEDCIRCLE_ATKER] )//Should only remove after the skill had been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER,INVALID_TIMER); } if (dstmd) { //Mob skill event for no damage skills (damage ones are handled in battle_calc_damage) [Skotlex] mob->log_damage(dstmd, src, 0); //Log interaction (counts as 'attacker' for the exp bonus) mob->skill_event(dstmd, src, tick, MSC_SKILLUSED|(skill_id<<16)); } if (sd && !(flag&1)) { // ensure that the skill last-cast tick is recorded sd->canskill_tick = timer->gettick(); if (sd->state.arrow_atk) { // consume arrow on last invocation to this skill. battle->consume_ammo(sd, skill_id, skill_lv); } skill->onskillusage(sd, bl, skill_id, tick); // perform skill requirement consumption if (skill_id != NC_SELFDESTRUCTION) skill->consume_requirement(sd,skill_id,skill_lv,2); } map->freeblock_unlock(); if (hookS) hookStop(); return 0; } HPExport void plugin_init(void) { addHookPre(skill, castend_nodamage_id, skill_castend_nodamage_id_pre); } HPExport void server_online(void) { ShowInfo("'%s' Plugin by Dastgir/Hercules. Version '%s'\n", pinfo.name, pinfo.version); } and im getting this error when i run the plugin In function ‘skill_castend_nodamage_id_pre’: fcpbypass.c:234:10: error: too few arguments to function ‘clif->skill_fail’ clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);