Jump to content

Naruto

Members
  • Content Count

    174
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Naruto


  1. 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 


  2. 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 


  3. 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 

    1.jpg

    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

     


  4. {
    	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 >_> 


  5. 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 

     


  6. 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

     

     


     


  7. giphy.gif

     

    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"
    	}

    giphy.gif

     

    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 


  8. 12 minutes ago, SyncMaster said:

    I once doubled the skill NJ_SYURIKEN by copying everything that was in the original skill to make a version that didn't consumption items, but the copy wasn't showing animation, have an idea why?

    1342661470_download(1).png.fad791eda84d79bdda4a7d87aa42cfa1.png

    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 


  9.  

     

    giphy.gif

     

    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

     

    giphy.gif

     

    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

     

     

     

     

     


  10. 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 

×
×
  • Create New...

Important Information

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