Jump to content

Naruto

Members
  • Content Count

    174
  • Joined

  • Last visited

  • Days Won

    10

Everything posted by Naruto

  1. Hi so Ive been working on making a universal skill for some unts.... In our database we have this section under a few skills who use the unt system ; Unit: { Id: 0x86 Layout: 3 Interval: 100 Target: "Enemy" } However we only have the option of giving a flag to the Id, unlike range and layout who can be seperated like so : Unit: { Id: 0xbb Layout: { Lv1: 1 Lv2: 1 Lv3: 1 Lv4: 2 Lv5: 2 Lv6: 2 Lv7: 3 Lv8: 3 Lv9: 3 Lv10: 4 } Interval: -1 Target: "All" Flag: { UF_PATHCHECK: true } } Adding a skill level modifier is possible, but heres something we can all do: Take a look at the use of flag Unit: { Id: [ 0x86, 0xf4 ] Layout: 3 Interval: 100 Target: "Enemy" } Alone it will have no effect on your skill and just serves its own purpose with whatever its told to do in the src.. ( Might wanna look at the skill). . . So warp portal uses 2 effects, the pulse then the stand still which are 2 different unts case UNT_WARP_ACTIVE: // warp portal opens (morph to a UNT_WARP_WAITING cell) group->unit_id = skill->get_unit_id(group->skill_id, 1); // UNT_WARP_WAITING clif->changelook(&su->bl, LOOK_BASE, group->unit_id); // restart timers group->limit = skill->get_time(group->skill_id,group->skill_lv); su->limit = skill->get_time(group->skill_id,group->skill_lv); // apply effect to all units standing on it map->foreachincell(skill->unit_effect,su->bl.m,su->bl.x,su->bl.y,group->bl_flag,&su->bl,timer->gettick(),1); break; this is the transition group->unit_id = skill->get_unit_id(group->skill_id, 1); // UNT_WARP_WAITING clif->changelook(&su->bl, LOOK_BASE, group->unit_id); So you could do this : group->unit_id = skill->get_unit_id(GS_DESPERADO, 1); looking at GS_DESPERADO in my db Unit: { Id: [ 0x86, 0xf4 ] Layout: 3 Interval: 100 Target: "Enemy" } I added the flag for some black fire i dont know So my use is to have a reusuable skill.... a throwing animation that lays down whatever effect i want it too however being reduced to 1 flag i can only attach one to the base throwing animation... so by making new skills , or just adding them next to skills that wont bother you, you can potentially change your skill effects however you want.... And the timer is like so : limit = skill->get_time(skill_id,skill_lv); case AL_WARP: val1=skill_lv+6; if(!(flag&1)) { limit=2000; } else { // previous implementation (not used anymore) //Warp Portal morphing to active mode, extract relevant data from src. [Skotlex] struct skill_unit *su = BL_CAST(BL_SKILL, src); if (su == NULL) return NULL; group = su->group; src = map->id2bl(group->src_id); if (src == NULL) return NULL; val2 = group->val2; //Copy the (x,y) position you warp to val3 = group->val3; //as well as the mapindex to warp to. } break; so back check for flag.... So this is how we do it the normal way : skill.c add your new one : case MG_FIREWALL: if(sc && sc->data[SC_VIOLENTGALE]) limit = limit*3/2; val2=4+skill_lv; break; case BS_HAMMERFALL: if(!(flag&1)) limit=2000; break; Im using bs_hammerfall in this case limit is the timer to change I gave it its own space for testing... but add it to ground skills case BS_HAMMERFALL: skill->unitsetting(src,skill_id,skill_lv,x,y,0); break; case WZ_ICEWALL: flag |= 1; if( skill->unitsetting(src,skill_id,skill_lv,x,y,0) ) map->list[src->m].setcell(src->m, x, y, CELL_NOICEWALL, true); break; and finally the unt I attached to it from the skill_db { Id: 110 Name: "BS_HAMMERFALL" Description: "Hammer Fall" MaxLevel: 5 Range: -9 Hit: "BDT_SKILL" SkillType: { Place: true } SkillInfo: { IgnoreLandProtector: true AllowReproduce: true } AttackType: "Weapon" Element: "Ele_Weapon" KnockBackTiles: 2 SkillData1: 6000 SkillData1: 2000 CoolDown: 0 Requirements: { SPCost: 15 } Unit: { Id: 0x10a Range: 2 Layout: 3 Interval: 100 Target: "Enemy" Flag: { UF_SKILL: true } } }, I made this one Id: 0x10a back in skill.c case UNT_MOLOTOV: group->unit_id = skill->get_unit_id(GS_DESPERADO, 1); clif->changelook(&su->bl, LOOK_BASE, group->unit_id); group->limit = skill->get_time(group->skill_id,group->skill_lv); su->limit = skill->get_time(group->skill_id,group->skill_lv); map->foreachincell(skill->unit_effect,su->bl.m,su->bl.x,su->bl.y,group->bl_flag,&su->bl,timer->gettick(),1); break; this is dirty but working, need to clean it up but im going to bed now o/ last thing I seperated them like this so i can reuse the same skill effect i use for throwing in a place skill : Earlier i said we seperated the groud placement, well lets go do this to it case BS_HAMMERFALL: if (pc->checkskill(sd, BS_HAMMERFALL) == 1) skill->unitsetting(src,skill_id,skill_lv,x,y,0); if (pc->checkskill(sd, BS_HAMMERFALL) == 2) skill->unitsetting(src,MG_FIREWALL,skill_lv,x,y,0); break;
  2. So ive been trying to deal with the movement on the grid but had issues with direcitonal, and lagging when you get hit Ive tried many things but the problem kept persisting until someone asked me why the lag doesnt happen on flying side kick.... case MR_LUNGE: if (unit->movepos(src, bl->x, bl->y, 1, 1)) { skill->brandishspear(src, bl, skill_id, skill_lv, tick, flag); clif->slide(src, bl->x, bl->y); } break; for my skill.c im using brandishspear function in an attack that lunges me towards the target before i would get caught during my cast time and i could move 3-4 times before the game elastic banned me if (unit->movepos(src, bl->x, bl->y, 1, 1)) { if we wrote it like this case MR_LUNGE: unit->movepos(src, bl->x, bl->y, 1, 1); skill->brandishspear(src, bl, skill_id, skill_lv, tick, flag); break; it looks like the zombies walk to the location i pointed at, but then i get shot there after a second or two... but then i set it to this : case MR_LUNGE: unit->movepos(src, bl->x, bl->y, 0, 0); skill->brandishspear(src, bl, skill_id, skill_lv, tick, flag); break; So it seems to me that unit_movepos is just another modifier we can use the final 2 moifiers are int easy, bool checkpath these are either 1 or 0... and i have no idea how they work without going through all the skills that use them however it seems to do the same things in game with my current code so just pick something your trying to match or flip em around if they dont work for whatever reason So in order to move visually we actually have to use these functions OR CLICK THE MOUSE ANYWHERE AND YOU WILL ZAP TO THAT CELL WITH THE WRITTEN ABOVE: clif->snap clif->slide skill->blown All are usuable in different ways... I just wanted to clearify how to remove the lag Actually a few notes from my clif.c jjust trying to go over and find this immediately static void clif_blown(struct block_list *bl) { //Aegis packets says fixpos, but it's unsure whether slide works better or not. nullpo_retv(bl); clif->fixpos(bl); clif->slide(bl, bl->x, bl->y); } Oh it turns out clif->fixpos is also a way to move you around the map
  3. just adding it to skilleffectinfo doc will override stuff, or you can do this case SM_PROVOKE: case SM_SELFPROVOKE: case MER_PROVOKE: { int failure; if( (tstatus->mode&MD_BOSS) || battle->check_undead(tstatus->race,tstatus->def_ele) ) { map->freeblock_unlock(); return 1; } //TODO: How much does base level affects? Dummy value of 1% per level difference used. [Skotlex] clif->skill_nodamage(src,bl,skill_id == SM_SELFPROVOKE ? SM_PROVOKE : skill_id,skill_lv, (failure = sc_start(src,bl,type, skill_id == SM_SELFPROVOKE ? 100:( 50 + 3*skill_lv + status->get_lv(src) - status->get_lv(bl)), skill_lv, skill->get_time(skill_id,skill_lv)))); if( !failure ) { if( sd ) clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0, 0); map->freeblock_unlock(); return 0; } unit->skillcastcancel(bl, 2); if( tsc && tsc->count ) { status_change_end(bl, SC_FREEZE, INVALID_TIMER); if( tsc->data[SC_STONE] && tsc->opt1 == OPT1_STONE ) status_change_end(bl, SC_STONE, INVALID_TIMER); status_change_end(bl, SC_SLEEP, INVALID_TIMER); status_change_end(bl, SC_TRICKDEAD, INVALID_TIMER); } if( dstmd ) { dstmd->state.provoke_flag = src->id; mob->target(dstmd, src, skill->get_range2(src,skill_id,skill_lv)); } } break; youd have to rip this line apart clif->skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv))); and change the last constant to this case BD_ADAPTATION: clif->skill_nodamage(src,bl,skill_id,skill_lv,-1); break; -1 makes it not display effect, skill still works.. havnt really tested it tho thst means you would have to seperate the sc_start from it.. pretty simple
  4. skill->brandishspear_dir(&tc,dir,4); 2 things correction from original post : I wrote -4 as a test and wrote it all up with it, but -4 would be back wards and 4 would be forward and 2) setting this to 0 caused some tile error with what i posted, probably fix able but would be a waste ? weird
  5. Hi I was working on another skill for a bit today I wanted to get certain mobs to spawn in certain squares... I managed to make a skill that places an area similar to cultivation from creator I couldnt figure out any other way to get them to spawn how I wanted but this should suffice... Switching it to target and NOT GROUND PLACED might take a bit of tweaking though this is a PLACE skill skill.c case CL_MAGGOT: int md1 = mob->once_spawn_sub(src, src->m, x-5, y, clif->get_bl_name(src), 1005, "", SZ_SMALL, AI_NONE); int md2 = mob->once_spawn_sub(src, src->m, x+5, y, clif->get_bl_name(src), 1005, "", SZ_SMALL, AI_NONE); int md3 = mob->once_spawn_sub(src, src->m, x, y-5, clif->get_bl_name(src), 1005, "", SZ_SMALL, AI_NONE); int md4 = mob->once_spawn_sub(src, src->m, x, y+5, clif->get_bl_name(src), 1005, "", SZ_SMALL, AI_NONE); mob->spawn (md1); mob->spawn (md2); mob->spawn (md3); mob->spawn (md4); break; I just declared a bunch of stuff, gave them numbers, you can name them whatever you want as you can see where it casts, it spawns enemies about 5 cells in 4 directions from the targeted location, again, this is a PLACE skill 1005 is my monster ID, feel free to change the SZ_ and AI_ to whatever you want AI_ATTACK is your personal friendly summons and skill.db { Id: 1614 Name: "CL_MAGGOT" Description: "Spawn Maggots" MaxLevel: 1 Range: 12 Hit: "BDT_SKILL" SkillType: { Place: true } DamageType: { NoDamage: true } SkillData1: 300000 CoolDown: 0 Requirements: { SPCost: 10 } }, ps : If you want them to follow you i think you just need this md->master_id = sd->bl.id; I dont know how to use it though as of the time I am writing this
  6. 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;
  7. sc_def = st->luk*3; sc_def2 = st->luk*3; probably a conf for it somewhere, just reverse it or post it for me
  8. Version 1.0.0

    17 downloads

    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
  9. View File 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 Naruto Submitted 07/30/19 Category Other Graphics  
  10. awh yall to embaressed to download it ?
  11. 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
  12. oh idk then, i was looking at it earlier but i forgot coincidentally ill see if i can find it again
  13. try setting it to -7 then use a bow, then a dagger
  14. 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
  15. its actually just me standing behind him casting heal on him while he does it
  16. 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: 1 try Range: -1
  17. Version 1.0.0

    22 downloads

    comes with paper doll + military uniform and an assault rifle THIS IS A FREE RELEASE FEEL FREE TO DO AS YOU PLEASE
  18. View File 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 Naruto Submitted 07/18/19 Category Other Graphics  
  19. 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
  20. 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 mapinfotable.scp
  21. 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
  22. { 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 >_>
  23. sooooo add them they have strs , the effects continue after tuna part 1097 @use effect im sure the ids continue with the source just like everything else
×
×
  • Create New...

Important Information

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