[Include] Missile Launcher
#1

Hi I would like to present include for Missile Launcher.

Video:
1. Sniper Missile
2. Vehicle Missile (MapAndreas Version)
3. Vehicle Missile (ColAndreas Update)
4. Marica Mortar V1
5. Heavy Marica Mortar
6. Missile Launcher Aim Player
7. Congreve Rocket
8. Marica Mortar V2
9. New Vehicle Missile
10. Flares

Functions:
PHP Code:
Missile::Launch(type,Float:detection_range,Float:explode_radius,Float:speed,Float:x,Float:y,Float:z,worldid,interiorid,playerid,
Float:streamdistance,missile_object,Float:tx,Float:ty,Float:tz,byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM,
bool:remote=false,remote_count=MAX_MISSILE_REMOTE_TARGET,remote_height=1.0,Float:arc_roll=0.0,Float:damage=-1.0,
Float:vehicle_damage=-1.0);
type - explosion type //https://sampwiki.blast.hk/wiki/Explosion_List
Float:detection_range - detection range player/vehicle
Float
:explode_radius - the explosion range (the same as in CreateExplosion)
Float:speed - projectile speed
Float
:x, Float:y, Float:z - Starting position
worldid
, interiorid, playerid, Float:streamdistance - the same as in CreateDynamicObject
missile_object
: MISSILE_OBJECT_NORMAL / MISSILE_OBJECT_BIG / MISSILE_OBJECT_HYDRA / MISSILE_OBJECT_BOMB / MISSILE_OBJECT_BOMB_STATIC / MISSILE_OBJECT_FLARE
Float
:tx, Float:ty, Float:tz - Target position
byplayerid 
- selected player will be immune to detection range
teamid 
- player team will be immune to detection range
remote 
- enable remote targeting (for Vehicle Missile Mortar)
remote_count - number of remote targeting 1 - 32
remote_height 
- arc height
arc_roll 
- rotation Y axis
Float
:damage - player damage on explosion created
Float
:vehicle_damage - vehicle damage on explosion created
Rotation
: Auto!
MissileLaunchAimPlayer(targetid,type,Float:detection_range,Float:explode_radius,Float:speed,Float:x,Float:y,Float:z,
worldid,interiorid,playerid,Float:streamdistance,missile_object,Float:tx,Float:ty,Float:tz,
byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM,Float:damage=-1.0,Float:vehicle_damage=-1.0);
MissileRemoteTarget(mobid,Float:tx,Float:ty,Float:tz,Float:speed = 0.0); 
Missile::Destroy(mobid);
mobid - id returned by Missile::Launch
Missile
::StopAimPlayer(mobid);
Missile::GetExplodeVisibility();
Missile::SetExplodeVisibility(Float:explode_stream);
Missile::DisableAllAim(playerid); 
Callbacks:
PHP Code:
OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid,byplayerid);
types:
MISSILE_DESTROY_TYPE_TARGET  //When rocket reaches its destination (always killerid=INVALID_PLAYER_ID)
MISSILE_DESTROY_TYPE_DETECT  //When rocket has been destroyed by detection range
MISSILE_DESTROY_TYPE_KILL    //When rocket has been destroyed by player
OnMissileDetectPlayer(playerid,killerid); //called when a player is within range of detection range
OnMissileRequestLaunch(Float:x,Float:y,Float:z,playerid,targetid); 
Example Code:
PHP Code:
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ){
    if(
weaponid == 34){
        new 
Float:x, Float:y, Float:z,
            
Float:tx, Float:ty, Float:tz,
            
Float:rx, Float:rz,
            
vw, int, Float:dist;
        
GetPlayerPos(playerid,x,y,z);
        
GetRotationFor2Point3D(x,y,z,fX,fY,fZ,rx,rz);
        
dist = GetDistanceBetweenPoints3D(x,y,z,fX,fY,fZ);
        
vw = GetPlayerVirtualWorld(playerid);
        
int = GetPlayerInterior(playerid);
        
GetPointInFront3D(x,y,z,rx,rz,4.0,tx,ty,tz);
        
Missile::Launch(MISSILE_TYPE_EXPLODE_HUGE,4.0,25.0,35.0,tx,ty,tz,vw,int,-1,300.0,MISSILE_OBJECT_HYDRA,fX,fY,fZ,playerid,.damage=100.0,.vehicle_damage=1000.0);
        
GetPointInFront3D(x,y,z,rx,rz,3.0,tx,ty,tz);
        
Missile::Launch(MISSILE_TYPE_EXPLODE_HUGE,4.0,25.0,35.0,tx,ty,tz+3.0,vw,int,-1,300.0,MISSILE_OBJECT_HYDRA,fX,fY,fZ+3.0,playerid,.damage=100.0,.vehicle_damage=1000.0);
        
Missile::Launch(MISSILE_TYPE_EXPLODE_HUGE,4.0,25.0,35.0,tx,ty,tz-3.0,vw,int,-1,300.0,MISSILE_OBJECT_HYDRA,fX,fY,fZ-3.0,playerid,.damage=100.0,.vehicle_damage=1000.0);
        
GetPointInFront3D(tx,ty,tz,rx,rz+90.0,3.0,x,y,z);
        
GetPointInFront3D(x,y,z,rx,rz,dist,fX,fY,fZ);
        
Missile::Launch(MISSILE_TYPE_EXPLODE_HUGE,4.0,25.0,35.0,x,y,z,vw,int,-1,300.0,MISSILE_OBJECT_HYDRA,fX,fY,fZ,playerid,.damage=100.0,.vehicle_damage=1000.0);
        
GetPointInFront3D(tx,ty,tz,rx,rz-90.0,3.0,x,y,z);
        
GetPointInFront3D(x,y,z,rx,rz,dist,fX,fY,fZ);
        
Missile::Launch(MISSILE_TYPE_EXPLODE_HUGE,4.0,25.0,35.0,x,y,z,vw,int,-1,300.0,MISSILE_OBJECT_HYDRA,fX,fY,fZ,playerid,.damage=100.0,.vehicle_damage=1000.0);
    }
    return 
1;
} 
Bullet example:
PHP Code:
Missile::Launch(MISSILE_TYPE_EXPLODE_NONE,1.0,1.0,20.0,Float:x,Float:y,Float:z,worldid,interiorid,playerid,Float:streamdistance,MISSILE_OBJECT_BULLET,Float:tx,Float:ty,Float:tz,byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM,.damage=5.0,.vehicle_damage=25.0); 
How to check is player kill by missile (this is not required if you using custom missile damage):
PHP Code:
enums:
last_missile_shot
last_missile_player
public OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid,byplayerid){
    if(
type == MISSILE_DESTROY_TYPE_DETECT && killerid != INVALID_PLAYER_ID){
        
PlayerInfo[killerid][last_missile_shot] = GetTickCount();
        
PlayerInfo[killerid][last_missile_player] = byplayerid;
    }
    return 
1;
}
public 
OnMissileDetectPlayer(playerid,killerid){
    if(
killerid != INVALID_PLAYER_ID){
        
PlayerInfo[playerid][last_missile_shot] = GetTickCount();
        
PlayerInfo[playerid][last_missile_player] = killerid;
    }
    return 
1;
}
public 
OnPlayerDeath(playerid, killerid, reason){
    if(
PlayerInfo[playerid][last_missile_player] != INVALID_PLAYER_ID && reason > 46 && playerid != killerid){
        if(
GetTickCount()-PlayerInfo[playerid][last_missile_shot] < 2000){
            
killerid = PlayerInfo[playerid][last_missile_player];
            
reason = 51;
        }
    }
    
    
//your code
    
return 1;
} 
Download:
Missile.inc
3DTryg.inc Thread
ColAndreas Plugin

See also Vehicle Missile Launcher


Non-Registered Users:
Bug Report
Reply
#2

Good work.. I made this before long time for my server, xD
rep+ for 3DTryg and all this aswell
Reply
#3

Wow.. Amazing ...
I Like your Job Man ...
Reply
#4

Update 1.2:
Added additional parameters:

Code:
MissileLaunch(type,Float:detection_range,Float:explode_radius,Float:speed,Float:x,Float:y,Float:z,
worldid,interiorid,playerid,Float:streamdistance,missile_object,
Float:tx,Float:ty,Float:tz,byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM); 

byplayerid - selected player will be immune to detection range
teamid - player team will be immune to detection range
Reply
#5

Update v1.3:

Added callback:
PHP Code:
OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid); 
Fix auto rotation for MISSILE_OBJECT_HYDRA
Reply
#6

Update v1.4:
- Added extended functions:
PHP Code:
Float:GetMissileExplodeVisibility();
SetMissileExplodeVisibility(Float:explode_stream); 
- Added version number
Reply
#7

Update v1.5B:
- Added callback:
PHP Code:
OnMissileDetectPlayer(playerid,killerid); 
- Fixed exploding rockets by passengers when they were fired from a vehicle @VehicleMissile.inc
Reply
#8

Update v1.6:
- Again fix rotation for MISSILE_OBJECT_HYDRA
- Fixed identification missile between scripts
- Changed value INVALID_MISSILE_ID from -1 to 0
Reply
#9

Update v1.6.4

- Added new params for MissileLaunch
Code:
MissileLaunch(type,Float:detection_range,Float:explode_radius,Float:speed,Float:x,Float:y,Float:z,worldid,interiorid,playerid,
Float:streamdistance,missile_object,Float:tx,Float:ty,Float:tz,byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM,
bool:remote=false,remote_count=MAX_MISSILE_REMOTE_TARGET,remote_height=1.0);
- Added function:
PHP Code:
MissileRemoteTarget(mobid,Float:tx,Float:ty,Float:tz,Float:speed = 0.0); 
- Added Definitions:
PHP Code:
MAX_MISSILE_REMOTE_TARGET 
- Timers removed, replaced OnDynamicObjectMoved
Reply
#10

Not anything I would use, but good job nonetheless!
Reply
#11

nice one
Reply
#12

Update v1.6.6:

- Fixed a random detection player who shoots. (Thank you for reporting @Slotomic)
Reply
#13

awesome
Reply
#14

Update v1.7.0:

- Added functions:
PHP код:
MissileLaunchAimPlayer(targetid,type,Float:detection_range,Float:explode_radius,Float:speed,Float:x,Float:y,Float:z,worldid,interiorid,playerid,Float:streamdistance,missile_object,Float:tx,Float:ty,Float:tz,byplayerid=INVALID_PLAYER_ID,teamid=ANY_TEAM);
bool:MissileStopAimPlayer(mobid); 
Video:
https://www.youtube.com/watch?v=bS6jnEebJR4
Reply
#15

Issues:
- Idle players don't see missile projectiles.
PHP код:
//Fix
public OnPlayerConnect(playerid){
    
Streamer_ToggleIdleUpdate(playerid,1);
    
    return 
1;
} 
Components:
Missile.inc
VehicleMissile.inc
VehicleMissileCol.inc
Reply
#16

Thanks for the include.
Is there any way to detect, if a player just killed a player / destroyed a vehicle with a missile?
Reply
#17

SAMP Synchronization is still suck, maybe this code working:
PHP код:
public OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid){
    
Tryg3DForeach(i){
        if(
IsPlayerInRangeOfPoint(i,5.0,x,y,z)){
            new 
Float:hp;
            
GetPlayerHealth(killerid,hp);
            if(
hp <= 0.0){
                
//bla bla bla
            
}
        }
    }
    
    return 
1;
} 
Reply
#18

Quote:
Originally Posted by AbyssMorgan
Посмотреть сообщение
SAMP Synchronization is still suck, maybe this code working:
PHP код:
public OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid){
    
Tryg3DForeach(i){
        if(
IsPlayerInRangeOfPoint(i,5.0,x,y,z)){
            new 
Float:hp;
            
GetPlayerHealth(killerid,hp);
            if(
hp <= 0.0){
                
//bla bla bla
            
}
        }
    }
    
    return 
1;
} 
A better way would be to set a boolean variable true upon missile hitting the player. Reset the boolean in case if the player has inflicted damage by something else. Under OnPlayerDeath, if the boolean variable is true, it can be concluded that player's death was caused by the missile explosion.
Reply
#19

Update v1.8.0:

- Updated callback:
Код:
OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid,byplayerid);
How to check is player kill by missile:
PHP код:
enums:
last_missile_shot
last_missile_player
public OnMissileDestroy(mobid,Float:x,Float:y,Float:z,type,killerid,byplayerid){
    if(
type == MISSILE_DESTROY_TYPE_DETECT && killerid != INVALID_PLAYER_ID){
        
PlayerInfo[killerid][last_missile_shot] = GetTickCount();
        
PlayerInfo[killerid][last_missile_player] = byplayerid;
    }
    return 
1;
}
public 
OnMissileDetectPlayer(playerid,killerid){
    if(
killerid != INVALID_PLAYER_ID){
        
PlayerInfo[playerid][last_missile_shot] = GetTickCount();
        
PlayerInfo[playerid][last_missile_player] = killerid;
    }
    return 
1;
}
public 
OnPlayerDeath(playerid, killerid, reason){
    if(
PlayerInfo[playerid][last_missile_player] != INVALID_PLAYER_ID && reason > 46 && playerid != killerid){
        if(
GetTickCount()-PlayerInfo[playerid][last_missile_shot] < 2000){
            
killerid = PlayerInfo[playerid][last_missile_player];
            
reason = 51;
        }
    }
    
    
//your code
    
return 1;
} 
Reply
#20

Update v1.8.1:

- Remove useless Timer after missile destroy
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)