Advertisement
Guest User

code

a guest
Aug 24th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.37 KB | None | 0 0
  1. enum PropTypeCheck
  2. {
  3.     PROP_NONE = 0,
  4.     PROP_RIGID = 1,
  5.     PROP_PHYSBOX = 2,
  6.     PROP_WEAPON = 3,
  7.     PROP_TF2OBJ = 4,//tf2 buildings
  8.     PROP_RAGDOLL = 5,
  9.     PROP_TF2PROJ = 6//tf2 projectiles
  10. };
  11.  
  12. new bool:IsRagdoll[2048];
  13. new bool:g_bIsWeaponGrabber[MAXPLAYERS + 1];
  14. new bool:entitygravitysave[MAXPLAYERS + 1];
  15. new Float:grabdistance[MAXPLAYERS + 1];
  16. new Float:playeranglerotate[MAXPLAYERS + 1][3];
  17. new Float:grabangle[MAXPLAYERS + 1][3];
  18. new PropTypeCheck:grabentitytype[MAXPLAYERS + 1];
  19.  
  20. new keybuffer[MAXPLAYERS + 1];
  21. new grabbedentref[MAXPLAYERS + 1] = {INVALID_ENT_REFERENCE, ...};
  22. new entityownersave[MAXPLAYERS + 1] = {INVALID_ENT_REFERENCE, ...};
  23.  
  24. new Float:DeathTime[MAXPLAYERS+1];
  25. new String:TargetDescription[2048][6][256];
  26.  
  27. public const Float:ZERO_VECTOR[3] = {0.0, 0.0, 0.0};
  28.  
  29. new bool:RoundCheck;
  30.  
  31. enum matrix3x4_t{
  32.  
  33.     Float:row0[4],
  34.     Float:row1[4],
  35.     Float:row2[4]
  36.  
  37. };
  38. public RoundStart(Handle:Spawn_Event, const String:Spawn_Name[], bool:Spawn_Broadcast)
  39. {
  40.     for(new Client = 1; Client <= MaxClients; Client++)
  41.     {
  42.         if(IsClientInGame(Client))
  43.         {
  44.             Job[Client] = 0;
  45.         }
  46.     }
  47.     GameCount = 20;
  48.     if(RoundCheck == false)
  49.     {
  50.         GameStart = false;
  51.         CreateTimer(1.0, Gameset, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  52.         RoundCheck = true;
  53.     }
  54. }
  55. public Action:Round_End(Handle:event, const String:Name[], bool:Broadcast)
  56. {
  57.     RoundCheck = false;
  58. }
  59. public EventDeath(Handle:Spawn_Event, const String:Spawn_Name[], bool:Spawn_BroadCast)
  60. {
  61.     new client = GetClientOfUserId(GetEventInt(Spawn_Event, "userid"));
  62.     new Entity = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
  63.    
  64.     AcceptEntityInput(Entity, "kill");
  65.    
  66.     new String:ModelName[256];
  67.     GetClientModel(client, ModelName, 256);
  68.    
  69.     if(!IsModelPrecached(ModelName))
  70.     {
  71.         PrecacheModel(ModelName, true);
  72.     }
  73.     new Float:Pos[3];
  74.    
  75.     GetClientAbsOrigin(client, Pos);
  76.     Pos[2] += 20.0;
  77.    
  78.     new String:TargetName[256];
  79.     Format(TargetName, 256, "%N", client);
  80.    
  81.     new ragdoll = CreateEntityByName("prop_ragdoll");
  82.     DispatchKeyValue(ragdoll, "targetname", TargetName);
  83.     DispatchKeyValue(ragdoll, "model", ModelName);
  84.     DispatchSpawn(ragdoll);
  85.     SetEntPropEnt(client, Prop_Send, "m_hRagdoll", ragdoll);
  86.     SetEntProp(ragdoll, Prop_Send, "m_nSolidType", 6);
  87.     SetEntProp(ragdoll, Prop_Send, "m_CollisionGroup", 2);
  88.     SetEntityModel(ragdoll, ModelName);
  89.     TeleportEntity(ragdoll, Pos, NULL_VECTOR, NULL_VECTOR);
  90.     SetEntPropVector(ragdoll, Prop_Send, "m_vecOrigin", Pos);
  91.    
  92.     IsRagdoll[client] = true;
  93.    
  94.     Format(TargetDescription[ragdoll][0], 256, "%f", DeathTime[client]);
  95. }
  96. public Action:WeaponSwitchHook(client, entity){
  97.    
  98.     decl String:weaponname[64];
  99.     if (!IsValidEntity(entity)){
  100.        
  101.         g_bIsWeaponGrabber[client] = false;
  102.         return Plugin_Continue;
  103.        
  104.     }
  105.     GetEdictClassname(entity, weaponname, sizeof(weaponname));
  106.    
  107.     //magic number is bad but i am to sleepy to make new defines
  108.     new rulecheck = 2;
  109.    
  110.     //현재 든 무기가 중력건 기능이 없거나, 기능을 가지고 있어도 물건을 들고있지 않은가
  111.     if(!isWeaponGrabber(GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon")) || EntRefToEntIndex(grabbedentref[client]) == -1 || !Phys_IsPhysicsObject(EntRefToEntIndex(grabbedentref[client]))){
  112.        
  113.         //든 물건이 없으므로, 바꾸기를 허락
  114.         g_bIsWeaponGrabber[client] = isWeaponGrabber(entity);
  115.         return Plugin_Continue;
  116.    
  117.     }else{
  118.        
  119.         //물건을 든 상태에서는 무기 바꾸기를 허락하지 않는다
  120.         if(rulecheck == 0){
  121.            
  122.             return Plugin_Handled;
  123.            
  124.         }else{
  125.        
  126.             g_bIsWeaponGrabber[client] = isWeaponGrabber(entity);
  127.             if(!g_bIsWeaponGrabber[client] || rulecheck == 1) release(client);
  128.             return Plugin_Continue;
  129.        
  130.         }  
  131.     }
  132. }
  133. public PreThinkHook(Client)
  134. {
  135.     if(isClientConnectedIngameAlive(Client))
  136.     {
  137.         new buttons = GetClientButtons(Client);
  138.         if((buttons & IN_ATTACK2))
  139.         {
  140.             if(grabbedentref[Client] == INVALID_ENT_REFERENCE)
  141.             {
  142.                 grab(Client);
  143.             }
  144.             else
  145.             {
  146.                 if(((buttons & IN_ATTACK2) && !(keybuffer[Client] & IN_ATTACK2)) || !g_bIsWeaponGrabber[Client])
  147.                 {
  148.                     //물건을 내려놓는다. try to release something
  149.                     release(Client);
  150.                
  151.                 }
  152.                 else
  153.                 {
  154.                     //물건을 잡은 상태를 유지한다 try to keep helding object
  155.                     hold(Client);
  156.                 }
  157.             }
  158.         }
  159.         else
  160.         {
  161.             keybuffer[Client] = keybuffer[Client] & ~IN_ATTACK2;
  162.         }
  163.     }
  164. }
  165. /*
  166. public Action:OnPlayerRunCmd(Client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
  167. {
  168.     if(isClientConnectedIngameAlive(Client))
  169.     {
  170.         if((buttons & IN_ATTACK2))
  171.         {
  172.             if(grabbedentref[Client] == INVALID_ENT_REFERENCE)
  173.             {
  174.                 grab(Client);
  175.             }
  176.             else
  177.             {
  178.                 if(((buttons & IN_ATTACK2) && !(keybuffer[Client] & IN_ATTACK2)) || !g_bIsWeaponGrabber[Client])
  179.                 {
  180.                     //물건을 내려놓는다. try to release something
  181.                     release(Client);
  182.                
  183.                 }
  184.                 else
  185.                 {
  186.                     //물건을 잡은 상태를 유지한다 try to keep helding object
  187.                     hold(Client);
  188.                 }
  189.             }
  190.         }
  191.         else
  192.         {
  193.             keybuffer[Client] = keybuffer[Client] & ~IN_ATTACK2;
  194.         }
  195.     }
  196. }
  197. */
  198. grab(client)
  199. {
  200.     new targetentity, Float:distancetoentity, Float:resultpos[3];
  201.    
  202.     targetentity = GetClientAimEntity(client, distancetoentity, resultpos);
  203.    
  204.     if(targetentity != -1)
  205.     {
  206.         new PropTypeCheck:entityType = entityTypeCheck(targetentity);
  207.        
  208.         if(entityType && !isClientConnectedIngameAlive(GetEntPropEnt(targetentity, Prop_Send, "m_hOwnerEntity")))
  209.         {  
  210.             if(distancetoentity <= 200.0)
  211.             {  
  212.                 if(!clientcangrab(client)){
  213.            
  214.                     return;
  215.                
  216.                 }
  217.                 if (entityType == PROP_TF2OBJ && GetEntPropEnt(targetentity, Prop_Send, "m_hBuilder") != client)
  218.                     return;
  219.  
  220.                 grabentitytype[client] = entityType;
  221.                
  222.                 if(entityType == PROP_RIGID){
  223.            
  224.                     SetEntProp(targetentity, Prop_Data, "m_bFirstCollisionAfterLaunch", false);
  225.                
  226.                 }
  227.                
  228.                 new lastowner = GetEntPropEnt(targetentity, Prop_Send, "m_hOwnerEntity");
  229.                
  230.                 if(lastowner != INVALID_ENT_REFERENCE){
  231.                
  232.                     entityownersave[client] = EntIndexToEntRef(lastowner);
  233.                
  234.                 }else{
  235.                
  236.                     entityownersave[client] = INVALID_ENT_REFERENCE;
  237.                    
  238.                 }
  239.                
  240.                 SetEntPropEnt(targetentity, Prop_Send, "m_hOwnerEntity", client);
  241.                 grabbedentref[client] = EntIndexToEntRef(targetentity);
  242.                
  243.                 SetEntPropEnt(targetentity, Prop_Data, "m_hParent", client);
  244.                
  245.                 //SetEntProp(targetentity, Prop_Data, "m_iEFlags", GetEntProp(targetentity, Prop_Data, "m_iEFlags") | EFL_NO_PHYSCANNON_INTERACTION);
  246.                
  247.                 entitygravitysave[client] = Phys_IsGravityEnabled(targetentity);
  248.                
  249.                 Phys_EnableGravity(targetentity, false);
  250.                
  251.                 decl Float:clienteyeangle[3], Float:entityangle[3];//, Float:entityposition[3];
  252.                 GetEntPropVector(grabbedentref[client], Prop_Send, "m_angRotation", entityangle);
  253.                 GetClientEyeAngles(client, clienteyeangle);
  254.                
  255.                 playeranglerotate[client][0] = 0.0;
  256.                 playeranglerotate[client][1] = 0.0;
  257.                 playeranglerotate[client][2] = 0.0;
  258.                
  259.                 grabangle[client][0] = 0.0;
  260.                 grabangle[client][1] = 0.0;
  261.                 grabangle[client][2] = 0.0;
  262.                
  263.                 grabdistance[client] = 100.0;
  264.                 /* GetEntPropVector(grabbedentref[client], Prop_Send, "m_vecOrigin", entityposition);
  265.                 grabpos[client][0] = entityposition[0] - resultpos[0];
  266.                 grabpos[client][1] = entityposition[1] - resultpos[1];
  267.                 grabpos[client][2] = entityposition[2] - resultpos[2]; */
  268.                
  269.                 new matrix[matrix3x4_t];
  270.                
  271.                 matrix3x4FromAnglesNoOrigin(clienteyeangle, matrix);
  272.                
  273.                 decl Float:temp[3];
  274.                
  275.                 MatrixAngles(matrix, temp);
  276.                
  277.                 TransformAnglesToLocalSpace(entityangle, grabangle[client], matrix);
  278.                
  279.                 keybuffer[client] = keybuffer[client] | IN_ATTACK2;    
  280.                
  281.                 decl Float:entityposition[3], Float:clientposition[3], Float:vector[3];
  282.                 GetEntPropVector(targetentity, Prop_Send, "m_vecOrigin", entityposition);
  283.                 GetClientEyePosition(client, clientposition);
  284.                 MakeVectorFromPoints(entityposition, clientposition, vector);
  285.                 NormalizeVector(vector, vector);
  286.                 ScaleVector(vector, 400.0);
  287.                
  288.                 decl Float:ZeroSpeed[3];
  289.                 ZeroVector(ZeroSpeed);
  290.                 Phys_SetVelocity(targetentity, vector, ZeroSpeed);
  291. //              decl String:netclass[64];
  292. //              GetEntityNetClass(targetentity, netclass, sizeof(netclass));
  293.                 if(FindDataMapInfo(targetentity, "m_hPhysicsAttacker") != -1) SetEntPropEnt(targetentity, Prop_Data, "m_hPhysicsAttacker", client);
  294.                 if(FindDataMapInfo(targetentity, "m_flLastPhysicsInfluenceTime") != -1) SetEntPropFloat(targetentity, Prop_Data, "m_flLastPhysicsInfluenceTime", GetGameTime());
  295.                 PrintToChatAll("DEBUG");
  296.             }
  297.         }
  298.     }
  299. }
  300. release(client){
  301.    
  302.     if(EntRefToEntIndex(grabbedentref[client]) != -1)
  303.     {
  304.         Phys_EnableGravity(EntRefToEntIndex(grabbedentref[client]), entitygravitysave[client]);
  305.         SetEntPropEnt(grabbedentref[client], Prop_Send, "m_hOwnerEntity", EntRefToEntIndex(entityownersave[client]));  
  306.     }
  307.     grabbedentref[client] = INVALID_ENT_REFERENCE;
  308.     keybuffer[client] = keybuffer[client] | IN_ATTACK2;
  309. }
  310. hold(client)
  311. {
  312.     //물건을 어디로 끌어갈지 정한다
  313.     decl Float:resultpos[3], Float:resultvecnormal[3];
  314.     GetClientAimPosition(client, grabdistance[client], resultpos, resultvecnormal, tracerayfilterrocket, client);
  315.    
  316.     decl Float:entityposition[3], Float:clientposition[3], Float:vector[3];
  317.     GetEntPropVector(grabbedentref[client], Prop_Send, "m_vecOrigin", entityposition);
  318.     GetClientEyePosition(client, clientposition);
  319.     decl Float:clienteyeangle[3];
  320.     GetClientEyeAngles(client, clienteyeangle);
  321.    
  322.     decl Float:clienteyeangleafterchange[3];
  323.    
  324.     clienteyeangleafterchange[0] = clienteyeangle[0] + playeranglerotate[client][0];
  325.     clienteyeangleafterchange[1] = clienteyeangle[1] + playeranglerotate[client][1];
  326.     clienteyeangleafterchange[2] = clienteyeangle[2] + playeranglerotate[client][2];
  327.    
  328.     decl playerlocalspace[matrix3x4_t], playerlocalspaceafterchange[matrix3x4_t];
  329.    
  330.     matrix3x4FromAnglesNoOrigin(clienteyeangle, playerlocalspace);
  331.     matrix3x4FromAnglesNoOrigin(clienteyeangleafterchange, playerlocalspaceafterchange);
  332.    
  333.     decl Float:resultangle[3];
  334.    
  335.     TransformAnglesToWorldSpace(grabangle[client], resultangle, playerlocalspaceafterchange);
  336.     TransformAnglesToLocalSpace(resultangle, grabangle[client], playerlocalspace);
  337.    
  338.     ZeroVector(playeranglerotate[client]);
  339.    
  340.     MakeVectorFromPoints(entityposition, resultpos, vector);
  341.     ScaleVector(vector, grabdistance[client]*10);
  342.    
  343.     //decl Float:entityangle[3], Float:angvelocity[3];
  344.     // GetEntPropVector(grabbedentref[client], Prop_Data, "m_angAbsRotation", entityangle);
  345.    
  346.     // decl targetanglespace[matrix3x4_t], Float:angletomove[3];
  347.     // matrix3x4FromAnglesNoOrigin(resultangle, targetanglespace);
  348.     // TransformAnglesToLocalSpace(entityangle, angletomove, targetanglespace);
  349.    
  350.     //angvelocity[0] = entityangle[0] - resultangle[0];
  351.     //angvelocity[1] = entityangle[1] - resultangle[1];
  352.     //angvelocity[2] = entityangle[2] - resultangle[2];
  353.    
  354.     //ZeroVector(angvelocity);
  355.     // NegateVector(angletomove);
  356.    
  357.     if(grabentitytype[client] != PROP_RAGDOLL){
  358.    
  359.         TeleportEntity(grabbedentref[client], NULL_VECTOR, resultangle, NULL_VECTOR);
  360.        
  361.     }
  362.    
  363.     Phys_SetVelocity(EntRefToEntIndex(grabbedentref[client]), vector, ZERO_VECTOR, true);
  364.    
  365.     if(grabentitytype[client] == PROP_RIGID || grabentitytype[client] == PROP_PHYSBOX || grabentitytype[client] == PROP_RAGDOLL){
  366.            
  367.         SetEntPropEnt(grabbedentref[client], Prop_Data, "m_hPhysicsAttacker", client);
  368.         SetEntPropFloat(grabbedentref[client], Prop_Data, "m_flLastPhysicsInfluenceTime", GetGameTime());
  369.        
  370.     }
  371.     if(grabentitytype[client] == PROP_RIGID){
  372.    
  373.         SetEntProp(grabbedentref[client], Prop_Data, "m_bThrownByPlayer", true);
  374.    
  375.     }
  376. }
  377. PropTypeCheck:entityTypeCheck(entity)
  378. {
  379.     new String:classname[64];
  380.     GetEdictClassname(entity, classname, 64);
  381.    
  382.     if(StrContains(classname, "prop_physics", false)  != -1)
  383.     {
  384.         return PROP_RIGID;
  385.     }
  386.     else if(StrContains(classname, "func_physbox", false)  != -1)
  387.     {
  388.         return PROP_PHYSBOX;
  389.     }
  390.     else if(StrContains(classname, "prop_ragdoll", false)  != -1)
  391.     {
  392.         return PROP_RAGDOLL;
  393.     }
  394.     else if(StrContains(classname, "weapon_", false)  != -1)
  395.     {
  396.         return PROP_WEAPON;
  397.     }
  398.     else if(StrContains(classname, "tf_projectile", false)  != -1)
  399.     {
  400.         return PROP_TF2PROJ
  401.     }
  402.     else if(StrEqual(classname, "obj_sentrygun", false) || StrEqual(classname, "obj_dispenser", false) || StrEqual(classname, "obj_teleporter", false))
  403.     {
  404.         return PROP_TF2OBJ;
  405.     }
  406.     else
  407.     {
  408.         return PROP_NONE;
  409.     }
  410. }
  411. stock matrix3x4FromAnglesNoOrigin(Float:angle[3], matrix[matrix3x4_t]){
  412.  
  413.     decl Float:fwd[3], Float:right[3], Float:up[3];
  414.    
  415.     new Float:origin[3] = {0.0, 0.0, 0.0};
  416.    
  417.     GetAngleVectors(angle, fwd, right, up);
  418.    
  419.     matrix3x4_tFromVector(fwd, right, up, origin, matrix);
  420.  
  421. }
  422. stock TransformAnglesToWorldSpace(Float:inputangle[3], Float:outputangle[3], parentmatrix[matrix3x4_t]){
  423.  
  424.     decl angtoparent[matrix3x4_t], angtoworld[matrix3x4_t];
  425.    
  426.     matrix3x4FromAnglesNoOrigin(inputangle, angtoparent);
  427.    
  428.     ConcatTransforms( parentmatrix, angtoparent, angtoworld);
  429.    
  430.     MatrixAngles(angtoworld, outputangle);
  431.    
  432. }
  433. stock TransformAnglesToLocalSpace(Float:angle[3], Float:out[3], parentMatrix[matrix3x4_t]){
  434.  
  435.     decl angToWorld[matrix3x4_t], worldToParent[matrix3x4_t], localMatrix[matrix3x4_t];
  436.    
  437.     MatrixInvert( parentMatrix, worldToParent );
  438.    
  439.     matrix3x4FromAnglesNoOrigin( angle, angToWorld );
  440.    
  441.     ConcatTransforms( worldToParent, angToWorld, localMatrix );
  442.    
  443.     MatrixAngles( localMatrix, out );
  444.  
  445. }
  446. stock matrix3x4_tFromVector(Float:fwd[3], Float:right[3], Float:up[3], Float:origin[3], matrix[matrix3x4_t]){
  447.  
  448.     matrix[row0][0] = fwd[0];
  449.     matrix[row0][1] = right[0];
  450.     matrix[row0][2] = up[0];
  451.     matrix[row0][3] = origin[0];
  452.    
  453.     matrix[row1][0] = fwd[1];
  454.     matrix[row1][1] = right[1];
  455.     matrix[row1][2] = up[1];
  456.     matrix[row1][3] = origin[1];
  457.    
  458.     matrix[row2][0] = fwd[2];
  459.     matrix[row2][1] = right[2];
  460.     matrix[row2][2] = up[2];
  461.     matrix[row2][3] = origin[2];
  462.  
  463. }
  464. stock ConcatTransforms(const in1[matrix3x4_t], const in2[matrix3x4_t], out[matrix3x4_t]){
  465.    
  466.     out[row0][0] = in1[row0][0] * in2[row0][0] + in1[row0][1] * in2[row1][0] + in1[row0][2] * in2[row2][0];
  467.     out[row0][1] = in1[row0][0] * in2[row0][1] + in1[row0][1] * in2[row1][1] + in1[row0][2] * in2[row2][1];
  468.     out[row0][2] = in1[row0][0] * in2[row0][2] + in1[row0][1] * in2[row1][2] + in1[row0][2] * in2[row2][2];
  469.     out[row0][3] = in1[row0][0] * in2[row0][3] + in1[row0][1] * in2[row1][3] + in1[row0][2] * in2[row2][3] + in1[row0][3];
  470.    
  471.     out[row1][0] = in1[row1][0] * in2[row0][0] + in1[row1][1] * in2[row1][0] + in1[row1][2] * in2[row2][0];
  472.     out[row1][1] = in1[row1][0] * in2[row0][1] + in1[row1][1] * in2[row1][1] + in1[row1][2] * in2[row2][1];
  473.     out[row1][2] = in1[row1][0] * in2[row0][2] + in1[row1][1] * in2[row1][2] + in1[row1][2] * in2[row2][2];
  474.     out[row1][3] = in1[row1][0] * in2[row0][3] + in1[row1][1] * in2[row1][3] + in1[row1][2] * in2[row2][3] + in1[row1][3];
  475.    
  476.     out[row2][0] = in1[row2][0] * in2[row0][0] + in1[row2][1] * in2[row1][0] + in1[row2][2] * in2[row2][0];
  477.     out[row2][1] = in1[row2][0] * in2[row0][1] + in1[row2][1] * in2[row1][1] + in1[row2][2] * in2[row2][1];
  478.     out[row2][2] = in1[row2][0] * in2[row0][2] + in1[row2][1] * in2[row1][2] + in1[row2][2] * in2[row2][2];
  479.     out[row2][3] = in1[row2][0] * in2[row0][3] + in1[row2][1] * in2[row1][3] + in1[row2][2] * in2[row2][3] + in1[row2][3];
  480.    
  481. }
  482. stock MatrixAngles(angtoworld[matrix3x4_t], Float:outputangle[3]){
  483.  
  484.     decl Float:fwd[3], Float:right[3], Float:up[3];
  485.    
  486.     fwd[0] = angtoworld[row0][0];
  487.     fwd[1] = angtoworld[row1][0];
  488.     fwd[2] = angtoworld[row2][0];
  489.     right[0] = angtoworld[row0][1];
  490.     right[1] = angtoworld[row1][1];
  491.     right[2] = angtoworld[row2][1];
  492.     up[0] = 0.0;
  493.     up[1] = 0.0;
  494.     up[2] = angtoworld[row2][2];
  495.    
  496.     new Float:xyDist = SquareRoot(fwd[0] * fwd[0] + fwd[1] * fwd[1]);
  497.    
  498.     if ( xyDist > 0.001 ){
  499.    
  500.         // (yaw)    y = ATAN( forward.y, forward.x );       -- in our space, forward is the X axis
  501.         outputangle[1] = RadToDeg( ArcTangent2( fwd[1], fwd[0] ) );
  502.         // (pitch)  x = ATAN( -forward.z, sqrt(forward.x*forward.x+forward.y*forward.y) );
  503.         outputangle[0] = RadToDeg( ArcTangent2( fwd[2] * -1, xyDist ) );
  504.         // (roll)   z = ATAN( left.z, up.z );
  505.         outputangle[2] = RadToDeg( ArcTangent2( right[2], up[2] ) );
  506.        
  507.     }else{// forward is mostly Z, gimbal lock-
  508.    
  509.         // (yaw)    y = ATAN( -left.x, left.y );            -- forward is mostly z, so use right for yaw
  510.         outputangle[1] = RadToDeg( ArcTangent2( right[0]  * -1, right[1] ) );
  511.         // (pitch)  x = ATAN( -forward.z, sqrt(forward.x*forward.x+forward.y*forward.y) );
  512.         outputangle[0] = RadToDeg( ArcTangent2( fwd[2]  * -1, xyDist ) );
  513.         // Assume no roll in this case as one degree of freedom has been lost (i.e. yaw == roll)
  514.         outputangle[2] = 0.0;
  515.        
  516.     }
  517.  
  518. }
  519. stock MatrixInvert(in1[matrix3x4_t], out[matrix3x4_t]){
  520.  
  521.     out[row0][0] = in1[row0][0];
  522.     out[row0][1] = in1[row1][0];
  523.     out[row0][2] = in1[row2][0];
  524.  
  525.     out[row1][0] = in1[row0][1];
  526.     out[row1][1] = in1[row1][1];
  527.     out[row1][2] = in1[row2][1];
  528.  
  529.     out[row2][0] = in1[row0][2];
  530.     out[row2][1] = in1[row1][2];
  531.     out[row2][2] = in1[row2][2];
  532.    
  533.     decl Float:tmp[3], Float:outrow0[3], Float:outrow1[3], Float:outrow2[3];
  534.     tmp[0] = in1[row0][3];
  535.     tmp[1] = in1[row1][3];
  536.     tmp[2] = in1[row2][3];
  537.    
  538.     outrow0[0] = out[row0][0];
  539.     outrow0[1] = out[row0][1];
  540.     outrow0[2] = out[row0][2];
  541.    
  542.     outrow1[0] = out[row1][0];
  543.     outrow1[1] = out[row1][1];
  544.     outrow1[2] = out[row1][2];
  545.    
  546.     outrow2[0] = out[row2][0];
  547.     outrow2[1] = out[row2][1];
  548.     outrow2[2] = out[row2][2];
  549.    
  550.     out[row0][3] = -GetVectorDotProduct(tmp, outrow0);
  551.     out[row1][3] = -GetVectorDotProduct(tmp, outrow1);
  552.     out[row2][3] = -GetVectorDotProduct(tmp, outrow2);
  553.    
  554. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement