PDA

View Full Version : plant an arrow at bulletimpact



Ni3ls
22nd May 2013, 11:05
Hello,

I made a recurve bow and an arrow. But since i cant manage to delete the explosion impact(using the bazooka file) only for the arrow, I thought it may be possible to plant an arrow at bullet impact. So instead of a bullethole, you will see an arrow sticking out. Is this possible?

kung foo man
22nd May 2013, 14:00
Of course its possible :)

Just check for attackButtonPressed() in a loop and if so: 1) spawn arrow 2) move forward till it collidies with wall or player

moveGravity() should be nice for that

IzNoGoD
22nd May 2013, 17:41
shoottube()
{
self endon("disconnect");
self addstat("grenadelaunchershots",1);
self updatestats();
tube=spawn("script_model",self geteyepos());
tube.angles=self getplayerangles();
tube setmodel(level.tubemodel);
tube movegravity(maps\mp\_utility::vectorscale(anglesto forward(self getplayerangles()),1500),20);
tube thread monitordisconnect(self);
time=0;
start=tube.origin;
oldorg=tube.origin;
trace=bullettrace(oldorg,tube.origin,true,self);
sonicboom=isdefined(self)&&self hasperk("sonicboom");
while(time<20&&(trace["fraction"]==1||oldorg==tube.origin||issame(trace["entity"],tube)))
{
trace=bullettrace(trace["position"],tube.origin,true,self);
oldorg=tube.origin;
time+=0.05;
wait 0.05;
if(oldorg!=tube.origin)
tube.angles=vectortoangles(vectornormalize(tube.or igin-oldorg));
}
if(isplayer(trace["entity"]))
{
if(tube.origin!=oldorg)
{
if(sonicboom)
trace["entity"] maps\mp\gametypes\_callbacksetup::CodeCallback_Pla yerDamage(self, self, level.tubemaxdamage*level.sonicboomdamagemultiplie r, 0, "MOD_EXPLOSIVE", level.tubecloseweap, trace["position"], vectornormalize(tube.origin-oldorg), "none", 0, "gl");
else
trace["entity"] maps\mp\gametypes\_callbacksetup::CodeCallback_Pla yerDamage(self, self, level.tubemaxdamage, 0, "MOD_EXPLOSIVE", level.tubecloseweap, trace["position"], vectornormalize(tube.origin-oldorg), "none", 0, "gl");
}
else
{
if(sonicboom)
trace["entity"] maps\mp\gametypes\_callbacksetup::CodeCallback_Pla yerDamage(self, self, level.tubemaxdamage*level.sonicboomdamagemultiplie r, 0, "MOD_EXPLOSIVE", level.tubecloseweap, trace["position"], vectornormalize(tube.origin-self.origin), "none", 0, "gl");
else
trace["entity"] maps\mp\gametypes\_callbacksetup::CodeCallback_Pla yerDamage(self, self, level.tubemaxdamage, 0, "MOD_EXPLOSIVE", level.tubecloseweap, trace["position"], vectornormalize(tube.origin-self.origin), "none", 0, "gl");
}
}
else if(distancesquared(start,trace["position"])<200*200)
{
if(!isdefined(level.c4explodefx[trace["surfacetype"]]))
tube playsound(level.tubewallhitsound+"default");
else
tube playsound(level.tubewallhitsound+trace["surfacetype"]);
}
else
{
tube explode(trace);
if(sonicboom)
{
doradiusplayerdamage(trace["position"],self,level.tubemindamage*level.sonicboomdamagemul tiplier,level.tubemaxdamage*level.sonicboomdamagem ultiplier,level.tuberange*level.sonicboomdistancem ultiplier,"MOD_EXPLOSIVE",level.tubeweap, "gl");
doradiusdamage(trace["position"],self,level.tubemindamage*level.sonicboomdamagemul tiplier,level.tubemaxdamage*level.sonicboomdamagem ultiplier,level.tuberange*level.sonicboomdistancem ultiplier);
}
else
{
doradiusplayerdamage(trace["position"],self,level.tubemindamage,level.tubemaxdamage,leve l.tuberange,"MOD_EXPLOSIVE",level.tubeweap, "gl");
doradiusdamage(trace["position"],self,level.tubemindamage,level.tubemaxdamage,leve l.tuberange);
}
}
tube notify("stop_monitor_disconnect");
tube delete();

}



explode(trace)
{
if(!isdefined(level.c4explodefx[trace["surfacetype"]]))
trace["surfacetype"]="default";
self playsound(level.c4explodesound+trace["surfacetype"]);
if(isdefined(trace["normal"]))
{
if(trace["normal"]!=(0,0,0))
playfx(level.c4explodefx[trace["surfacetype"]],trace["position"],trace["normal"]);
else
playfx(level.c4explodefx[trace["surfacetype"]],trace["position"]);
}
else
playfx(level.c4explodefx[trace["surfacetype"]],trace["position"]);
}


monitordisconnect(tomonitor)
{
self endon("stop_monitor_disconnect");
tomonitor waittill("disconnect");
self delete();
}