|
New Member
Join Date: Feb 2016
Location: Shanghai,China
|

02-04-2016
, 09:25
Is the relationship between "pev_v_angle"and "pev_angles" is very special?
|
#1
|
I am writting a plugin about "Remote Control Airplane" and I met a problem about "pev_v_angle" and "pev_angles" 
I set the view to the plane entity. Now I want to use my crosshair to control it, so I make its model angle(pev_angles) pace with my view angle(pev_v_angle).
I use the method below
Code:
(Ham_Think)
new Float:TargetOrigin[3], Float:VecOrigin[3], Float:VecAngles[3]
pev(pev(iEntity, pev_owner), pev_v_angle, VecAngles)
//VecAngles[0] *= -1.0
set_pev(iEntity, pev_angles, VecAngles)
engfunc(EngFunc_MakeVectors, VecAngles)
global_get(glb_v_forward, TargetOrigin)
xs_vec_mul_scalar(TargetOrigin, 150.0, VecOrigin)
set_pev(iEntity, pev_velocity, VecOrigin)
Then the problem came: As my mouse slide down, my view also slide down and the plane move down, but it just rotate the plane model upward !? 
Just like this in other players' eyes

I know there is something difference between "pev_angles" and "pev_v_angle", so I try to add the code
Code:
VecAngles[0] *= -1.0
It works and... As my mouse slide down, it rotate the plane model downward now, but my view slide up and the plane also move up!!! 
I also tried to set the "pev_v_angle" valve again after set the "pev_angles" value, but it didn't work any way.
Is the relationship between "pev_v_angle" and "pev_angles" is very special? Could you tell me how to code them in the right way? 
I'm sorry for my broken English
Here is my full-sourcecode(not finished yet)
Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#define PLUGIN "miku"
#define VERSION "1.0"
#define AUTHOR "sky"
new g_explode, g_tail
new haveknife[33]
new const g_szMapConditions[][] =
{
"func_bomb_target",
"info_bomb_target",
"func_hostage_rescue",
"func_escapezone",
"func_vip_safetyzone" ,
"hostage_entity"
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_Item_AddToPlayer, "weapon_usp", "HAM_USPAddToPlayer_Post")
RegisterHam(Ham_Item_AddToPlayer, "weapon_glock18", "HAM_GLOCKAddToPlayer_Post")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "HAM_PrimaryAttack")
RegisterHam(Ham_Item_Deploy, "weapon_knife", "HAM_Item_Deploy_Post", 1)
RegisterHam(Ham_Think, "info_target", "fw_Think")
register_forward(FM_Spawn, "fw_Spawn")
register_forward(FM_Touch, "fw_Touch_Post", 1)
register_event("CurWeapon", "CurrentWeapon", "be", "1=1")
register_event("HLTV", "Event_Round_Start", "a", "1=0", "2=0")
register_clcmd("buy", "ClientCommand_Buy")
server_cmd("sv_restartround 1")
register_message(get_user_msgid("StatusIcon"), "Message_StatusIcon")
}
public plugin_precache()
{
precache_model("models/harry.mdl")
precache_model("models/p_air.mdl")
precache_model("models/v_air.mdl")
g_tail = precache_model("sprites/white.spr")
g_explode = precache_model("sprites/explode1.spr")
new ent=engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_map_parameters"))
set_pdata_int(ent, 34, 3)
dllfunc(DLLFunc_Spawn, ent)
register_clcmd("weapon_gauss","weapon_hook")
}
public weapon_hook(id)
{
engclient_cmd(id,"weapon_knife")
return PLUGIN_HANDLED
}
public Event_Round_Start()
{
new iEntity = -1
while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", "airplane"))) engfunc(EngFunc_RemoveEntity, iEntity)
}
public HAM_USPAddToPlayer_Post(iWeapon, this)
return HAM_SUPERCEDE
public HAM_GLOCKAddToPlayer_Post(iWeapon, this)
return HAM_SUPERCEDE
public HAM_Item_Deploy_Post(iEntity)
{
new id = get_pdata_cbase(iEntity, 41, 4)
UTIL_PlayWeaponAnimation(id, 1)
set_pdata_float(id, 83, 0.62, 5)
set_pev(id, pev_viewmodel2, "models/v_air.mdl")
set_pev(id, pev_weaponmodel2, "models/p_air.mdl")
}
public CurrentWeapon(id)
{
if (!is_user_alive(id))
return
new iEntity = pev(id, pev_euser1)
if (iEntity <= 0)
return
set_pev(id, pev_viewmodel2, "models/v_air.mdl")
set_pev(id, pev_weaponmodel2, "models/p_air.mdl")
}
public HAM_PrimaryAttack(this)
{
new iPlayer = get_pdata_cbase(this, 41, 4)
new classname[32]
pev(iPlayer, pev_classname, classname, 31)
new Float:origin[3]//, Float:angles[3]
//pev(iPlayer, pev_v_angle, angles)
get_aim_origin_vector(iPlayer, 20.0, 0.0, 10.0, origin)
new iEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
set_pev(iPlayer, pev_euser1, iEntity)
set_pev(iEntity, pev_classname, "airplane")
set_pev(iEntity, pev_nextthink, get_gametime()+0.1)
set_pev(iEntity, pev_solid, SOLID_TRIGGER)
set_pev(iEntity, pev_movetype, MOVETYPE_TOSS)
set_pev(iEntity, pev_owner, iPlayer)
//set_pev(iEntity, pev_v_angle, angles)
engfunc(EngFunc_SetModel, iEntity, "models/harry.mdl")
set_pev(iEntity, pev_euser1, 1)
set_pev(iEntity, pev_renderfx, kRenderFxGlowShell)
set_pev(iEntity, pev_rendercolor, {255.0, 0.0, 0.0})
set_pev(iEntity, pev_renderamt, 10.0)
set_pev(iEntity, pev_rendermode, kRenderNormal)
engfunc(EngFunc_SetSize, iEntity, {-1.0, -1.0, -1.0}, {1.0, 1.0, 1.0})
engfunc(EngFunc_SetOrigin, iEntity, origin)
/*new Float:start[3], Float:view_ofs[3], Float:end[3]
pev(iPlayer, pev_origin, start)
pev(iPlayer, pev_view_ofs, view_ofs)
xs_vec_add(start, view_ofs, start)
pev(iPlayer, pev_v_angle, end)
engfunc(EngFunc_MakeVectors, end)
global_get(glb_v_forward, end)
xs_vec_mul_scalar(end, 8120.0, end)
xs_vec_add(start, end, end)
engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, iPlayer, 0)
get_tr2(0, TR_vecEndPos, end)
new Float:velocity[3]
get_speed_vector(origin, end, 300.0, velocity)
set_pev(iEntity, pev_velocity, velocity)*/
new Float:fl_iNewVelocity[3]
velocity_by_aim(iPlayer, 150, fl_iNewVelocity)
set_pev(iEntity, pev_velocity, fl_iNewVelocity)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(iEntity)
write_short(g_tail)
write_byte(32)
write_byte(4)
write_byte(255)
write_byte(0)
write_byte(0)
write_byte(255)
message_end()
fm_strip_user_weapons(iPlayer)
haveknife[iPlayer] = 0
engfunc(EngFunc_SetView, iPlayer, iEntity)
return HAM_SUPERCEDE
}
public fw_Spawn(iEntity)
{
static szClassName[32];
pev(iEntity, pev_classname, szClassName, charsmax(szClassName));
for(new i = 0; i < sizeof(g_szMapConditions); ++i)
{
if(equal(szClassName, g_szMapConditions[i]))
{
engfunc(EngFunc_RemoveEntity, iEntity);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public fw_Think(iEntity)
{
if(!pev_valid(iEntity))
return HAM_IGNORED
new classname[32]
pev(iEntity, pev_classname, classname, charsmax(classname))
if(strcmp(classname, "airplane"))
return HAM_IGNORED
if(pev(iEntity, pev_euser1) != 1)
return HAM_IGNORED
new Float:TargetOrigin[3], Float:VecOrigin[3], Float:VecAngles[3]//, Float:FixAngles[3]
pev(pev(iEntity, pev_owner), pev_v_angle, VecAngles)
//VecAngles[0] *= -1.0
set_pev(iEntity, pev_angles, VecAngles)
pev(iEntity, pev_v_angle, FixAngles)
//FixAngles[0] *= -1.0
set_pev(pev(iEntity, pev_owner), pev_v_angle, FixAngles)
engfunc(EngFunc_MakeVectors, VecAngles)
global_get(glb_v_forward, TargetOrigin)
xs_vec_mul_scalar(TargetOrigin, 150.0, VecOrigin)
set_pev(iEntity, pev_velocity, VecOrigin)
/*new owner = pev(iEntity, pev_owner)
new Float:fl_iNewVelocity[3]
velocity_by_aim(owner, 300, fl_iNewVelocity)
set_pev(iEntity, pev_velocity, fl_iNewVelocity)*/
set_pev(iEntity, pev_nextthink, get_gametime()+0.01)
/*new Float:fVelocity[3], Float:fAngle[3]
pev(iEntity, pev_velocity, fVelocity)
vector_to_angle(fVelocity,fAngle)*/
return HAM_IGNORED
}
public fw_Touch_Post(iEntity, iptr)
{
if(!pev_valid(iEntity))
return
new classname[32];
pev(iEntity, pev_classname, classname, 31);
if(strcmp(classname, "airplane") )
return
new fvelocity
pev(iEntity, pev_velocity, fvelocity)
new Float:vecOrigin[3];
pev(iEntity, pev_origin, vecOrigin);
new classname_2[32];
pev(iptr, pev_classname, classname_2, 31);
if(!strcmp(classname_2, "worldspawn") )
{
set_task(0.1, "TASK_TOUCH", iEntity + 100)
message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, pev(iEntity, pev_owner))
write_short((1<<12)*1)
write_short((1<<12)*1)
write_short(0x0002)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(255)
message_end()
}
else if(iptr <= 32 && haveknife[iptr] == 0 && is_user_alive(iptr) && pev(iEntity, pev_flags)&FL_ONGROUND == 512)
{
haveknife[iptr] = 1
fm_give_item(iptr, "weapon_knife")
engfunc(EngFunc_RemoveEntity, iEntity)
return
}
}
public TASK_TOUCH(sbhl)
{
new iEntity = sbhl - 100
if(pev(iEntity, pev_flags)&FL_ONGROUND != 512)
return
new Float:vecOrigin[3];
pev(iEntity, pev_origin, vecOrigin);
new id = pev(iEntity, pev_owner)
engfunc(EngFunc_SetView, id, id)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(TE_EXPLOSION);
engfunc(EngFunc_WriteCoord, vecOrigin[0]);
engfunc(EngFunc_WriteCoord, vecOrigin[1]);
engfunc(EngFunc_WriteCoord, vecOrigin[2]);
write_short(g_explode);
write_byte(25);
write_byte(30);
write_byte(0);
message_end();
set_pev(iEntity, pev_euser1, 2)
new iVicim = -1
while((iVicim = engfunc(EngFunc_FindEntityInSphere, iVicim, vecOrigin, 10)) > 0)
{
if (!pev_valid(iVicim))
continue
if(iVicim == pev(iEntity, pev_owner))
continue
if (pev(iVicim, pev_takedamage) == DAMAGE_NO)
continue
if(get_user_team(iVicim) == get_user_team(pev(iEntity, pev_owner)))
continue
new Ptdclassname[32]
pev(iVicim, pev_classname, Ptdclassname, charsmax(Ptdclassname))
if (!strcmp(Ptdclassname, "func_breakable")) dllfunc(DLLFunc_Use, iVicim, iEntity)
ExecuteHam(Ham_TakeDamage, iVicim, iEntity,pev(iEntity, pev_owner), 15, DMG_CLUB)
}
return
}
stock get_speed_vector(const Float:origin1[3], const Float:origin2[3], Float:speed, Float:new_velocity[3])
{
xs_vec_sub(origin2, origin1, new_velocity)
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
xs_vec_mul_scalar(new_velocity, num, new_velocity)
}
stock get_aim_origin_vector(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
{
new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
pev(iPlayer, pev_origin, vOrigin)
pev(iPlayer, pev_view_ofs, vUp)
xs_vec_add(vOrigin, vUp, vOrigin)
pev(iPlayer, pev_v_angle, vAngle)
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight)
angle_vector(vAngle, ANGLEVECTOR_UP, vUp)
vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}
stock fm_get_aim_origin(id, Float:origin[3])
{
new Float:start[3], Float:view_ofs[3], Float:TargetOrigin[3]
pev(id, pev_origin, start)
pev(id, pev_view_ofs, view_ofs)
xs_vec_add(start, view_ofs, start)
pev(id, pev_v_angle, TargetOrigin)
engfunc(EngFunc_MakeVectors, TargetOrigin)
global_get(glb_v_forward, TargetOrigin)
xs_vec_mul_scalar(TargetOrigin, 9999.0, TargetOrigin)
xs_vec_add(start, TargetOrigin, TargetOrigin)
engfunc(EngFunc_TraceLine, start, TargetOrigin, 0, id, 0)
get_tr2(0, TR_vecEndPos, origin)
return 1
}
stock drop_weapons(iPlayer, Slot)
{
new item = get_pdata_cbase(iPlayer, 367+Slot, 4)
while(item > 0)
{
static classname[24]
pev(item, pev_classname, classname, charsmax(classname))
engclient_cmd(iPlayer, "drop", classname)
item = get_pdata_cbase(item, 42, 5)
}
set_pdata_cbase(iPlayer, 367, -1, 4)
}
stock fm_strip_user_weapons(index)
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString,"player_weaponstrip"))
if(!pev_valid(ent))
return 0
dllfunc(DLLFunc_Spawn, ent)
dllfunc(DLLFunc_Use, ent, index)
engfunc(EngFunc_RemoveEntity, ent)
return 1
}
stock fm_give_item(index, const wEntity[])
{
new iEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, wEntity))
new Float:origin[3]
pev(index, pev_origin, origin)
set_pev(iEntity, pev_origin, origin)
set_pev(iEntity, pev_spawnflags, pev(iEntity, pev_spawnflags) | SF_NORESPAWN)
dllfunc(DLLFunc_Spawn, iEntity)
new save = pev(iEntity, pev_solid)
dllfunc(DLLFunc_Touch, iEntity, index)
if(pev(iEntity, pev_solid) != save) return iEntity
engfunc(EngFunc_RemoveEntity, iEntity)
return -1
}
stock fm_find_ent_by_model(index, const classname[], const model[])
{
new ent = index, mdl[72];
while ((ent = fm_find_ent_by_class(ent, classname))) {
pev(ent, pev_model, mdl, sizeof mdl - 1);
if (equal(mdl, model))
return ent;
}
return 0;
}
stock fm_find_ent_by_class(index, const classname[]) return engfunc(EngFunc_FindEntityByString, index, "classname", classname)
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
set_pev(Player, pev_weaponanim, Sequence)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
write_byte(Sequence)
write_byte(pev(Player, pev_body))
message_end()
}
public ClientCommand_Buy() return PLUGIN_HANDLED_MAIN
public Message_StatusIcon(msgid, msg_TargetOrigin, id)
{
new icon[5]
get_msg_arg_string(2, icon, 4)
if (icon[0]=='b' && icon[2]=='y' && icon[3]=='z')
{
if (get_msg_arg_int(1))
{
set_pdata_int(id, 235, get_pdata_int(id,235)&~(1<<0))
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
|
|