-
Content Count
174 -
Joined
-
Last visited
-
Days Won
10
Posts posted by Naruto
-
-
sc_def = st->luk*3; sc_def2 = st->luk*3;
probably a conf for it somewhere, just reverse it or post it for me -
Inspection :O ?
-
Poring eating a cookie
I made a background for my log in
I threw a random ass poring on my door just for fun
It wasnt exactly rippable so i remade it in case someone wants it
-
Submitter
-
Submitted07/30/19
-
Category
-
-
just a little curious of the lack of cards from the older new expansions,
or was it just the lack of ALL the types of eles/races/damage types ?
dont rememeer
-
oh idk then, i was looking at it earlier but i forgot coincidentally
ill see if i can find it again
-
try setting it to -7 then use a bow, then a dagger
-
i dont think theirs anything stopping you from doing that.... i mean you got the packets to deal with but whatever , besides that ; you can probably do a bit
.... show me something cool we dont already have
-
On 7/19/2019 at 9:36 AM, bWolfie said:it is probably something really simple like misconfiguration. try fiddling with all the settings related to this thing.
and then if not misconfig, then there is a chance it is due to poor server specs leading to slow performance.
its actually just me standing behind him casting heal on him while he does it
-
pretty sure if you set it to -1 then it defaults to weapon range
Id: 136
Name: "AS_SONICBLOW"
Description: "Sonic Blow"
MaxLevel: 10
Range: 1try
Range: -1
-
military sprite
comes with paper doll + military uniform and an assault rifle
THIS IS A FREE RELEASE
FEEL FREE TO DO AS YOU PLEASE
-
Submitter
-
Submitted07/18/19
-
Category
-
-
try this
from the wiki
Trap Duration lasts 4 times as long in War of Emperium.
case RA_ELECTRICSHOCKER: case RA_CLUSTERBOMB: case RA_MAGENTATRAP: case RA_COBALTTRAP: case RA_MAIZETRAP: case RA_VERDURETRAP: case RA_FIRINGTRAP: case RA_ICEBOUNDTRAP: { struct skill_condition req = skill->get_requirement(sd,skill_id,skill_lv); ARR_FIND(0, MAX_SKILL_ITEM_REQUIRE, i, req.itemid[i] && (req.itemid[i] == ITEMID_BOOBY_TRAP || req.itemid[i] == ITEMID_SPECIAL_ALLOY_TRAP)); if( i != MAX_SKILL_ITEM_REQUIRE && req.itemid[i] ) req_item = req.itemid[i]; if( map_flag_gvg2(src->m) || map->list[src->m].flag.battleground ) limit *= 4; // longer trap times in WOE [celest] if( battle_config.vs_traps_bctall && map_flag_vs(src->m) && (src->type&battle_config.vs_traps_bctall) ) target = BCT_ALL; } break;
first off do backwards check for what limit is
limit = skill->get_time(skill_id,skill_lv);
ok lets do this then
change this number
if( map_flag_gvg2(src->m) || map->list[src->m].flag.battleground ) limit *= 4;
BTW get_time is skilldata1
get_time2 is skilldata2 . . . etc
in your skill db in pre re or renewal section
-
If you ever delete all the contents of the data folder, because your depending on your english translation, some files arent included
this one in particular kept sending me error :
maptableinfo.scp
Not sure what it does but heres my copy
-
So i had to go over my brandish spear again but figured out most of it
Can be used a few different ways..... splash on a grid with movement is really smooth with it
The results of this modification is my magicalbullet and desperado is a UNT skill
No idea how to explain it other then for you to try it yourself :
struct square { int val1[19]; int val2[19]; };
This number for square should be increased as high as you can if you wanna keep using this square grid... Ill have to verify this later because re declaring it causes issues but its relative to the amount of cells were hitting
static void skill_brandishspear_first(struct square *tc, uint8 dir, int16 x, int16 y) { nullpo_retv(tc); if(dir == 0){ tc->val1[0]=x; tc->val1[1]=x+1; tc->val1[2]=x-1; tc->val1[3]=x; tc->val1[4]=x+1; tc->val1[5]=x+1; tc->val1[6]=x; tc->val1[7]=x+1; tc->val1[8]=x-1; tc->val1[9]=x; tc->val1[10]=x+1; tc->val1[11]=x-1; tc->val1[12]=x; tc->val1[13]=x+1; tc->val1[14]=x-1; tc->val1[15]=x; tc->val1[16]=x+1; tc->val1[17]=x-1; tc->val2[0]=y; tc->val2[1]=y; tc->val2[2]=y; tc->val2[3]=y-1; tc->val2[4]=y-1; tc->val2[5]=y-1; tc->val2[6]=y-2; tc->val2[7]=y-2; tc->val2[8]=y-2; tc->val2[9]=y-3; tc->val2[10]=y-3; tc->val2[11]=y-3; tc->val2[12]=y-4; tc->val2[13]=y-4; tc->val2[14]=y-4; tc->val2[15]=y+1; tc->val2[16]=y+1; tc->val2[17]=y+1; } else if(dir==2){ tc->val1[0]=x+3; tc->val1[1]=x+3; tc->val1[2]=x+3; tc->val1[3]=x+4; tc->val1[4]=x+4; tc->val1[5]=x+4; tc->val1[6]=x+2; tc->val1[7]=x+2; tc->val1[8]=x+2; tc->val1[9]=x+1; tc->val1[10]=x+1; tc->val1[11]=x+1; tc->val1[12]=x-1; tc->val1[13]=x-1; tc->val1[14]=x-1; tc->val1[15]=x; tc->val1[16]=x; tc->val1[17]=x; tc->val2[0]=y; tc->val2[1]=y+1; tc->val2[2]=y-1; tc->val2[3]=y; tc->val2[4]=y+1; tc->val2[5]=y+1; tc->val2[6]=y; tc->val2[7]=y+1; tc->val2[8]=y-1; tc->val2[9]=y; tc->val2[10]=y+1; tc->val2[11]=y-1; tc->val2[12]=y; tc->val2[13]=y+1; tc->val2[14]=y-1; tc->val2[15]=y; tc->val2[16]=y+1; tc->val2[17]=y-1; } else if(dir==4){ tc->val1[0]=x; tc->val1[1]=x+1; tc->val1[2]=x-1; tc->val1[3]=x; tc->val1[4]=x+1; tc->val1[5]=x+1; tc->val1[6]=x; tc->val1[7]=x+1; tc->val1[8]=x-1; tc->val1[9]=x; tc->val1[10]=x+1; tc->val1[11]=x-1; tc->val1[12]=x; tc->val1[13]=x+1; tc->val1[14]=x-1; tc->val1[15]=x; tc->val1[16]=x+1; tc->val1[17]=x-1; tc->val2[0]=y; tc->val2[1]=y; tc->val2[2]=y; tc->val2[3]=y+1; tc->val2[4]=y+1; tc->val2[5]=y+1; tc->val2[6]=y+2; tc->val2[7]=y+2; tc->val2[8]=y+2; tc->val2[9]=y+3; tc->val2[10]=y+3; tc->val2[11]=y+3; tc->val2[12]=y+4; tc->val2[13]=y+4; tc->val2[14]=y+4; tc->val2[15]=y-1; tc->val2[16]=y-1; tc->val2[17]=y-1; } else if(dir==6){ tc->val1[0]=x-3; tc->val1[1]=x-3; tc->val1[2]=x-3; tc->val1[3]=x-4; tc->val1[4]=x-4; tc->val1[5]=x-4; tc->val1[6]=x-2; tc->val1[7]=x-2; tc->val1[8]=x-2; tc->val1[9]=x-1; tc->val1[10]=x-1; tc->val1[11]=x-1; tc->val1[12]=x+1; tc->val1[13]=x+1; tc->val1[14]=x+1; tc->val1[15]=x; tc->val1[16]=x; tc->val1[17]=x; tc->val2[0]=y; tc->val2[1]=y+1; tc->val2[2]=y-1; tc->val2[3]=y; tc->val2[4]=y+1; tc->val2[5]=y+1; tc->val2[6]=y; tc->val2[7]=y+1; tc->val2[8]=y-1; tc->val2[9]=y; tc->val2[10]=y+1; tc->val2[11]=y-1; tc->val2[12]=y; tc->val2[13]=y+1; tc->val2[14]=y-1; tc->val2[15]=y; tc->val2[16]=y+1; tc->val2[17]=y-1; } else if(dir==1){ tc->val1[0]=x; tc->val1[1]=x+1; tc->val1[2]=x+2; tc->val1[3]=x; tc->val1[4]=x; tc->val1[5]=x+1; tc->val1[6]=x+2; tc->val1[7]=x+2; tc->val1[8]=x+1; tc->val1[9]=x+1; tc->val1[10]=x+2; tc->val1[11]=x+2; tc->val1[12]=x+3; tc->val1[13]=x+3; tc->val1[14]=x+3; tc->val1[15]=x+4; tc->val1[16]=x+3; tc->val1[17]=x+4; tc->val1[18]=x+4; tc->val2[0]=y; tc->val2[1]=y; tc->val2[2]=y; tc->val2[3]=y-1; tc->val2[4]=y-2; tc->val2[5]=y-1; tc->val2[6]=y-1; tc->val2[7]=y-2; tc->val2[8]=y-2; tc->val2[9]=y-3; tc->val2[10]=y-3; tc->val2[11]=y-4; tc->val2[12]=y-4; tc->val2[13]=y-1; tc->val2[14]=y-2; tc->val2[15]=y-2; tc->val2[16]=y-3; tc->val2[17]=y-3; tc->val2[18]=y-4; } else if(dir==3){ tc->val1[0]=x+4; tc->val1[1]=x+4; tc->val1[2]=x+4; tc->val1[3]=x+3; tc->val1[4]=x+3; tc->val1[5]=x+3; tc->val1[6]=x+3; tc->val1[7]=x+2; tc->val1[8]=x+2; tc->val1[9]=x+2; tc->val1[10]=x+2; tc->val1[11]=x+2; tc->val1[12]=x+1; tc->val1[13]=x+1; tc->val1[14]=x+1; tc->val1[15]=x+1; tc->val1[16]=x; tc->val1[17]=x; tc->val1[18]=x; tc->val2[0]=y+4; tc->val2[1]=y+3; tc->val2[2]=y+2; tc->val2[3]=y+4; tc->val2[4]=y+3; tc->val2[5]=y+2; tc->val2[6]=y+1; tc->val2[7]=y+4; tc->val2[8]=y+3; tc->val2[9]=y+2; tc->val2[10]=y+1; tc->val2[11]=y; tc->val2[12]=y+3; tc->val2[13]=y+2; tc->val2[14]=y+1; tc->val2[15]=y; tc->val2[16]=y+2; tc->val2[17]=y+1; tc->val2[18]=y; } else if(dir==5){ tc->val1[0]=x-4; tc->val1[1]=x-3; tc->val1[2]=x-2; tc->val1[3]=x-4; tc->val1[4]=x-3; tc->val1[5]=x-2; tc->val1[6]=x-1; tc->val1[7]=x-4; tc->val1[8]=x-3; tc->val1[9]=x-2; tc->val1[10]=x-1; tc->val1[11]=x; tc->val1[12]=x-3; tc->val1[13]=x-2; tc->val1[14]=x-1; tc->val1[15]=x; tc->val1[16]=x-2; tc->val1[17]=x-1; tc->val1[18]=x; tc->val2[0]=y+4; tc->val2[1]=y+4; tc->val2[2]=y+4; tc->val2[3]=y+3; tc->val2[4]=y+3; tc->val2[5]=y+3; tc->val2[6]=y+3; tc->val2[7]=y+2; tc->val2[8]=y+2; tc->val2[9]=y+2; tc->val2[10]=y+2; tc->val2[11]=y+2; tc->val2[12]=y+1; tc->val2[13]=y+1; tc->val2[14]=y+1; tc->val2[15]=y+1; tc->val2[16]=y; tc->val2[17]=y; tc->val2[18]=y; } else if(dir==7){ tc->val1[0]=x-4; tc->val1[1]=x-3; tc->val1[2]=x-2; tc->val1[3]=x-4; tc->val1[4]=x-3; tc->val1[5]=x-2; tc->val1[6]=x-1; tc->val1[7]=x-4; tc->val1[8]=x-3; tc->val1[9]=x-2; tc->val1[10]=x-1; tc->val1[11]=x; tc->val1[12]=x-3; tc->val1[13]=x-2; tc->val1[14]=x-1; tc->val1[15]=x; tc->val1[16]=x-2; tc->val1[17]=x-1; tc->val1[18]=x; tc->val2[0]=y-4; tc->val2[1]=y-4; tc->val2[2]=y-4; tc->val2[3]=y-3; tc->val2[4]=y-3; tc->val2[5]=y-3; tc->val2[6]=y-3; tc->val2[7]=y-2; tc->val2[8]=y-2; tc->val2[9]=y-2; tc->val2[10]=y-2; tc->val2[11]=y-2; tc->val2[12]=y-1; tc->val2[13]=y-1; tc->val2[14]=y-1; tc->val2[15]=y-1; tc->val2[16]=y; tc->val2[17]=y; tc->val2[18]=y; } }
this is my grid
need to make sure you mark the cell YOU ARE STANDING ON if you wanna use it with RANGED
I cant explain the grid but hold on maybe i can draw it
basically you have a slot for x and y as you look at this
tc->val1[17]=x; tc->val1[18]=x; tc->val2[0]=y+4; tc->val2[1]=y+3; tc->val2[2]=y+2;
you see how Y starts after 18 Xs for this direction ?
so these two would be a pair
tc->val1[0]=x-4;
tc->val2[0]=y-4;
Im looking at direction 7 which is...facing the top right from center
That would be the out most cells
static void skill_brandishspear_dir(struct square *tc, uint8 dir, int are) { int c; nullpo_retv(tc); for( c = 0; c < 19; c++ ) { switch( dir ) { case 0: tc->val2[c]+=are; break; case 1: tc->val1[c]-=are; tc->val2[c]+=are; break; case 2: tc->val1[c]-=are; break; case 3: tc->val1[c]-=are; tc->val2[c]-=are; break; case 4: tc->val2[c]-=are; break; case 5: tc->val1[c]+=are; tc->val2[c]-=are; break; case 6: tc->val1[c]+=are; break; case 7: tc->val1[c]+=are; tc->val2[c]+=are; break; } } }
I changed this to increase the max of growth function
for( c = 0; c < 19; c++ ) {
so now we wont get stack errors
and finally
static void skill_brandishspear(struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int64 tick, int flag) { int c,n=0; uint8 dir; struct square tc; int x, y; nullpo_retv(bl); x = bl->x; y = bl->y; dir = map->calc_dir(src, x, y); skill->brandishspear_first(&tc,dir,x,y); skill->brandishspear_dir(&tc,dir,4); skill->area_temp[1] = bl->id; for(c=0;c<19;c++){ if(c==0||c==19) skill->brandishspear_dir(&tc,dir,-1); map->foreachincell(skill->area_sub, bl->m,tc.val1[c%19],tc.val2[c%19],BL_CHAR, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, skill->castend_damage_id); } }
first line
int c,n=0;
No idea what N does but to me it is useless, im pretty sure N is the amount of tiers in brandish spear.. lvl 1 3 7 and 9
skill->brandishspear_dir(&tc,dir,4);
So this is why its flipped, the final number is the placement , so if you set it to 0, it would be closer to you... its weird but id leave it -4 for the same results that i get
for(c=0;c<19;c++){ if(c==0||c==19) skill->brandishspear_dir(&tc,dir,-1); map->foreachincell(skill->area_sub, bl->m,tc.val1[c%19],tc.val2[c%19],BL_CHAR, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, skill->castend_damage_id); }
finally set all these otherwise just get stack errors
so if you wanna re use it which ill verify, you just need to set a large struct sqaure and youll be all good
cookie-rae and bWolfie reacted to this -
{ Id: 5043 Name: "SU_LUNATICCARROTBEAT2" Description: "Lunatic Carrot Beat 2" MaxLevel: 5 Hit: "BDT_SKILL" SkillType: { Enemy: true } SkillInfo: { Chorus: true } AttackType: "Weapon" InterruptCast: true Requirements: { SPCost: 1 } },
this is the last one in my db...
just keep adding +1 and recreate the new summoner skill
need to add some bare minimal coding of at least a no damage function to make anything work
shit i wouldnt be surprised if they use the new skill effect info for these skills >_>
-
sooooo add them
Quote/** Summoner */
SU_BASIC_SKILL = 5018,
SU_BITE,
SU_HIDE,
SU_SCRATCH,
SU_STOOP,
SU_LOPE,
SU_SPRITEMABLE,
SU_POWEROFLAND,
SU_SV_STEMSPEAR,
SU_CN_POWDERING,
SU_CN_METEOR,
SU_SV_ROOTTWIST,
SU_SV_ROOTTWIST_ATK,
SU_POWEROFLIFE,
SU_SCAROFTAROU,
SU_PICKYPECK,
SU_PICKYPECK_DOUBLE_ATK,
SU_ARCLOUSEDASH,
SU_LUNATICCARROTBEAT,
SU_POWEROFSEA,
SU_TUNABELLY,
SU_TUNAPARTY,
SU_BUNCHOFSHRIMP,
SU_FRESHSHRIMP,
SU_CN_METEOR2,
SU_LUNATICCARROTBEAT2,
SU_SOULATTACK,
SU_POWEROFFLOCK,
SU_SVG_SPIRIT,
SU_HISS,
SU_NYANGGRASS,
SU_GROOMING,
SU_PURRING,
SU_SHRIMPARTY,
SU_SPIRITOFLIFE,
SU_MEOWMEOW,
SU_SPIRITOFLAND,
SU_CHATTERING,
SU_SPIRITOFSEA,they have strs , the effects continue after tuna part 1097 @use effect
im sure the ids continue with the source just like everything else
-
try adding them to the skill_tree
-
sometimes i had to play with the color table when you switch between rgb and index hit custom
but i cant see your sprite
i usually just paste onto another sprite though that always works
-
rostrviewer Effects sample tutorial
Ouchh i just realized my effect is pretty violent and intended for viewers over 19 years of age.
So when i first opened rostr vierwer i went through it all and it seemed usable but couldnt get my custom textures to work
anyways after playing around with it i figured out how everything worked , animations and transparency
it seemed like the iro strs were coded weirdly or whatever and just copying them would leave black textures and stuff
but you should be able to figure it out with this zip
-
Submitter
-
Submitted07/09/19
-
Category
-
-
Hi working on getting auras to work simply.....
So for this I use sg_warm_sun since its a damaging aura, but its going to be practically the same process for everything else
first up make a new status in status.h and .c
status->set_sc( WT_DRAGON , SC_DRAGON , SI_BLANK , SCB_NONE );
Dont need to do anything else here unless you want to
next lets go to map.c
add this
if (sc->data[SC_DRAGON]) skill->unit_move_unit_group(skill->id2group(sc->data[SC_DRAGON]->val4), bl->m, x1-x0, y1-y0); if (sc->data[SC_WARM]) skill->unit_move_unit_group(skill->id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0);
back to skill.c to work on the new skill i made
case WT_DRAGON: skill->clear_unitgroup(src); if ((sg = skill->unitsetting(src,skill_id,skill_lv,src->x,src->y,0))) sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill->get_time(skill_id,skill_lv)); break; case SG_SUN_WARM: case SG_MOON_WARM: case SG_STAR_WARM:
case UNT_DUMMYSKILL: switch (sg->skill_id) { case WT_DRAGON: skill->attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); clif->specialeffect(bl,92,1); break; case SG_SUN_WARM: case SG_MOON_WARM: case SG_STAR_WARM:
so a note on UNT_DUMMSKILL, it represents unt id 0x86, which is the cookie cutter unt used in things that arent placable... are their own unts like sanctuary and stuff
i make it bf_magic cause its easy to edit in battle.c wait till last step
and ofc specialeffect 92 is id, check areas... but i think it might be ok on 1, or 0 or just AREA
next skill_db
{ Id: 1609 Name: "WT_DRAGON" Description: "Exploding Dragon" MaxLevel: 3 Range: 1 Hit: "BDT_SKILL" SkillType: { Self: true } AttackType: "Magic" Element: "Ele_Weapon" DamageType: { SplashArea: true } SplashRange: 1 InterruptCast: true KnockBackTiles: 2 AfterCastActDelay: 1000 SkillData1: { Lv1: 10000 Lv2: 20000 Lv3: 60000 Lv4: 60000 Lv5: 60000 Lv6: 60000 Lv7: 60000 Lv8: 60000 Lv9: 60000 Lv10: 60000 } CoolDown: 0 Requirements: { SPCost: 20 } Unit: { Id: 0x86 Range: 1 Interval: 100 Target: "Enemy" } },
skilldata1 is the time it survives , how do you know its skilldata 1 ?
here :
sc_start4(src,src,type,100,skill_lv,0,0,sg->group_id,skill->get_time(skill_id,skill_lv));
get_time
get_time2 would be data2 in skill db and so on 3 to 4
since aura is linked to Status, its only for us...
now open battle.c
break; case WZ_STORMGUST: skillratio += 40 * skill_lv; break; case WT_DRAGON: skillratio += 100 * skill_lv; break;
right so this post will only cover how to activate it with a timer
its up to you to figure out how to do the rest but easy to disable / reanable with button by following pa_gospel and adding effects too.. Pa_gospel has it all really
Something else you can do now is just change this number in the skill_db
Unit: { Id: 0x86 Range: 1 Interval: 100 Target: "Enemy" }
now we linked status to aura we can change the unit id here to be any unt in the game like violent gale and deluge auras, they copy their respective UNT_DELUGE entries
anyways i did this for example :
Unit: { Id: 0x9c Range: 1 Interval: 100 Target: "Enemy" }
my examples only lasted 3 seconds (3000 skilldata1) just so i can test time in my post
Ahhh pretty sure this is everything, let me know if you encounter an issue
Its weird, i remember a couple years back when i started playing with clif_specialeffect it didnt cast when you killed them with a skill directly... but it kills them and shows effect when you use them in unt's, i had a skill that was an aura back then that just slowed everyone around you it also had special effects attached but never bothered trying it on a dps aura.... interesting ... its a bit more work and a different way to write skills but at least youd have access to every effect in the client... pretty sure skilleffectinfo has a couple flaws
-
12 minutes ago, SyncMaster said:probably cause you werent using it like WL_CHAINLIGHTNING_ATK since thats where its animation is
but if your talking about a new skill using the throw shuriken animation just as its own
you need to call BF_WEAPON and throw shuriken together in the skill.c ... that is, if you cant make it with skilleffectinfo in the data.grf
something like this
skill->attack(BF_WEAPON,src,src,bl,NJ_SYURIKEN,skill_lv,tick,flag);
then just make a bunch of different options in syuriken and you could link them to other skills possibly easily.... id have to find the proper call or whatever though... but ill post about it if you dont figure it out
because the animation itself is linked to the skill id
SyncMaster reacted to this -
ahh didnt try that but everything should be clean when you use it yourself !
-
so basically just went over every thing in chainlightning 1 day and i can modify it without screwing up the game
So for the gif above you need to remove everything about
NJ_SYURIKEN
then lets continue back into the skill.c
case WL_CHAINLIGHTNING: clif->skill_nodamage(src,bl,skill_id,skill_lv,1); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,NJ_SYURIKEN,skill_lv,0,flag); break;
by repeating the addtimerskill line, we can multiply the amount of times we send off a chain reaction, so im throwing 6 sets of shurikens, originally it was this :
case WL_CHAINLIGHTNING: clif->skill_nodamage(src,bl,skill_id,skill_lv,1); skill->addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,WL_CHAINLIGHTNING_ATK,skill_lv,0,flag); break;
I changed WL_CHAINLIGHTNING_ATK to NJ_SYURIKEN like we will for every entry for this source post
also you should have removed any previous syurikens so it was empty except in skill.h and battle c ( might need to remove it from battle.c)
case NJ_SYURIKEN: case WL_CHAINLIGHTNING_ATK: skill->attack(BF_MAGIC, src, src, target, skl->skill_id, skl->skill_lv, tick, (9-skl->type)); skill->toggle_magicpower(src, skl->skill_id); struct map_session_data *sd = BL_UCAST(BL_PC, src); int cr = (pc->checkskill(sd, WL_CHAINLIGHTNING) / 2); //cr is amount of bounces if (skl->type < (cr + skl->skill_lv - skl->skill_lv) && skl->x < 3) { struct block_list *nbl = battle->get_enemy_area(src, target->x, target->y, (skl->type>2)?3:4, //area BL_CHAR|BL_SKILL, target->id); if (nbl == NULL) skl->x++; else skl->x = 0; //tick is time just modify digit over 50 for visible results skill->addtimerskill(src, tick + 100, (nbl?nbl:target)->id, skl->x, 0, NJ_SYURIKEN, skl->skill_lv, skl->type + 1, skl->flag); } break;
so i added a easy variable to change as you want if you wanna balance it, int cr = skill level * 25, if you can do this you can probably whip something else up ... i changed the formula so it negated itself because it was cause problems otherwise
tick + time, i dont touch tick and keep the digit over 50
area is just modified to be bigger then the original... i just leave it as it is since it doesnt really bother me, but if you set it to 1:1 then it wont move so much but obviously shorter range
you can keep playing with it but this is all you need
switch(skl->skill_id){ case NJ_SYURIKEN: case WL_CHAINLIGHTNING_ATK: case WL_TETRAVORTEX_FIRE: case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: // SR_FLASHCOMBO case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: case SR_TIGERCANNON: case SR_SKYNETBLOW:
copy everything
editor note : the copy_skill thing is actually what a rogue with plagirize would copy, sooo if you get hit by the bolt of the skill where the damage i dealt, youll be copying the WL_CHAINLIGHTINING as an icon
case NJ_SYURIKEN: case WL_CHAINLIGHTNING_ATK: copy_skill = WL_CHAINLIGHTNING; break;
case NJ_SYURIKEN: case WL_CHAINLIGHTNING_ATK: dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,NJ_SYURIKEN,-2,BDT_SKILL); break;
you gonna need to change everything in the battle.c too but if you delete it it will just be 100% magic damage
I added like 40 of those chains and this is what it looks like
i just realized i was using chain lightning for the gifs, but the idea was to use it with the throw shuriken skill ... thats why we changed everything ... and we turned shuriken into the _ATK part of chain attack so we have the animation attached.... so you need to make a new skill and copy chainlightning completly....
so just make a new skill call it NJ_SHURIKENPRE and copy chain lightning then make NJ_SYURKEN copy CHAINLIGHTNING_ATK
SyncMaster reacted to this -
I dont play ragnarok 🖖
-
56 minutes ago, kanemi said:Yes I was planning to pay but I wanted to maintain control of the server. I'm looking to customize some items and skill mechanics.
I'm guessing it's not a great idea to do this then, since I'd have no idea what's being changed?
Well if you know WHAT TO TEST FOR its not so annoying.... but you can easily sneak in a few numbers that you wouldnt know were fake or real and he could exploit it in game.... or just break it all together making you reinstall your emulator and having to refill all the data you had previously again . . .
You can pm me for most of that stuff and ill just do it in quick assistance for you + explanation... but a full time dev, idk i wont speak for anyone since im lazy and only write for like an hour a day when i do open my src
Need help with hatred reset and disable hatred to emperium
in Source Support
Posted
you can try just doing this to your skill.c
case SG_HATE: if (dstmd && dstmd->class_ == MOBID_EMPELIUM) { clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0, 0); return 0; } if (sd) { clif->skill_nodamage(src,bl,skill_id,skill_lv,1); if (!pc->set_hate_mob(sd, skill_lv-1, bl)) clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0, 0); } break;