2/3 chance plant the Critical stickybomb http://i.imgur.com/2oqnr.jpg Download Source Code STICKYBOMB.rar Download .GRF STICKYBOMB.grf db\\mob_db2.txt
2127,SOCCER_BALL,stickbomb,stickbomb,1,2000,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,0,3,86,0x0040,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db\\mob_avail.txt
2127,1792
data\\lua files\\skillinfoz\\skillid.lua
STICKYBOMB = 999,
STICKYBOMBBOMB = 998,
data\\lua files\\skillinfoz\\skillinfolist.lua
[sKID.STICKYBOMB] = {
"STICKYBOMB";
SkillName = "STICKYBOMB",
MaxLv = 10,
SpAmount = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 },
},
[sKID.STICKYBOMBBOMB] = {
"STICKYBOMBBOMB";
SkillName = "STICKYBOMBBOMB",
},
battle.c http://pastebin.com/....php?i=5VizNY5g Find this function.
int battle_calc_damage(struct block_l...
go to the end.
status_damage(src, s_bl, damage, 0, clif_damage(s_bl, s_bl, gettick(), 500, 500, damage, -1, 0, 0), 0);
return ATK_NONE;
}
}
}
return damage;
}
add
damage=stickybombdamage(src, bl, damage);
top the
return damage;
and add new function
int stickybombdamage(struct block_list *src, struct block_list *bl, int damage)
{
int _far=0, i=0;
if(src->sbp==bl->sbp)
return 0;
for(i=0;i<=MAX_STICKYBOMB;i++)
if(src->stickbomb[i]!=-1)
break;
if(i==MAX_STICKYBOMB)
damage = damage*3;
else
{
_far = distance_xy(src->x,src->y,bl->x,bl->y)+1;
_far = _far >= 10 ? 10 : _far ;
damage = damage/_far;
}
return damage;
}
map.c http://pastebin.com/....php?i=aKRM2P9V
pc_makesavestatus(sd);
pc_clean_skilltree(sd);
chrif_save(sd,1);
unit_free_pc(sd);
killstickybmob(sd,0); //Add
return 0;
map.h http://pastebin.com/....php?i=UuyR67YF
struct block_list {
struct block_list *next,*prev;
int id, sbp; //Add
short m,x,y;
enum bl_type type;
int stickbomb[MAX_STICKYBOMB]; //Add
};
mmo.h
#define MAX_STICKYBOMB 8 //Add
pc.c http://pastebin.com/....php?i=H2zxukgJ Add this function.
void killstickybmob(struct map_session_data* sd, int t)
{
struct block_list *mb = NULL;
int i=0;
if(sd==NULL)
return;
for(;i <= MAX_STICKYBOMB ;i++)
{
mb=map_id2bl(sd->bl.stickbomb[i]);
if(mb!=NULL)
if(!t)
status_kill(mb);
else
unit_skilluse_id(mb, mb->id, 173, 1);
else
continue;
}
return;
}
pc.h Add this define.
void killstickybmob(struct map_session_data* sd, int t);
skill.c http://pastebin.com/....php?i=4dGTqDri Add this function.
void _STICKYBOMB(struct block_list *src, struct block_list *bl, int skillid, int skilllv)
{
int _x=0, _y=0, i=0, id=0;
struct block_list *mb = NULL;
switch(unit_getdir(bl))
{
case 0: _x = 0; _y = 1; break;
case 1: _x = -1; _y = 1; break;
case 2: _x = -1; _y = 0; break;
case 3: _x = -1; _y = -1; break;
case 4: _x = 0; _y = -1; break;
case 5: _x = 1; _y = -1; break;
case 6: _x = 1; _y = 0; break;
case 7: _x = 1; _y = 1; break;
}
_x = _x*(skilllv-1);
_y = _y*(skilllv-1);
clif_skill_nodamage(src,bl,skillid,skilllv,0);
id=mob_once_spawn(BL_CAST(BL_PC, src),src->m,src->x+_x,src->y+_y,"StickBomb",2127,1,"");
src->sbp++;
if(src->sbp==MAX_STICKYBOMB)
src->sbp=0;
mb=map_id2bl(src->stickbomb[src->sbp]);
if(mb!=NULL)
unit_skilluse_id(mb, mb->id, 173, 1);
src->stickbomb[src->sbp]=id;
mb=map_id2bl(src->stickbomb[src->sbp]);
mb->sbp=src->id;
if(rand()%3)
{
for(i=0;i<MAX_STICKYBOMB;i++)
mb->stickbomb[i]=-1;
clif_specialeffect(mb, 47,AREA);
}else
for(i=0;i<MAX_STICKYBOMB;i++)
mb->stickbomb[i]=0;
return;
}
Go to this function
int skill_castend_nodamage_id
find this
case SM_ENDURE:
and add below
case STICKYBOMB:
_STICKYBOMB(src, bl, skillid, skilllv);
break;
case STICKYBOMBBOMB:
clif_skill_nodamage(src,bl,skillid,skilllv,0);
killstickybmob(map_id2sd(src->id),1);
break;
skill.h
enum e_skill {
STICKYBOMB = 999, //Add
STICKYBOMBBOMB = 998, //Add
NV_BASIC = 1,
db\\skill_cast_db.txt
999,0,0,1000:1500:2000:2500:3000:3500:4000:4500:5000:5500,0,0,0 //Add
db\\skill_require_db.txt
999,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //STICKYBOMB //Add
998,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //STICKYBOMBBOMB //Add