HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #pragma semicolon 1
  2.  
  3. #include <sourcemod>
  4. #include <sdktools>
  5.  
  6. #define PLUGIN_VERSION "1.1.0"
  7.  
  8. #define MOVETYPE_WALK 2
  9. #define MOVETYPE_FLYGRAVITY 5
  10. #define MOVECOLLIDE_DEFAULT 0
  11. #define MOVECOLLIDE_FLY_BOUNCE 1
  12.  
  13. #define LIFE_ALIVE 0
  14.  
  15. new Handle:sm_jetpack = INVALID_HANDLE;
  16. new Handle:sm_jetpack_sound = INVALID_HANDLE;
  17. new Handle:sm_jetpack_speed = INVALID_HANDLE;
  18. new Handle:sm_jetpack_volume = INVALID_HANDLE;
  19.  
  20. new g_iLifeState = -1;
  21. new g_iMoveCollide = -1;
  22. new g_iMoveType = -1;
  23. new g_iVelocity = -1;
  24.  
  25. new String:g_sSound[255] = "vehicles/airboat/fan_blade_fullthrottle_loop1.wav";
  26.  
  27. new bool:g_bJetpacks[MAXPLAYERS + 1] = {false,...};
  28.  
  29. new Float:g_fTimer = 0.0;
  30.  
  31. new g_iMaxClients = 0;
  32.  
  33. public Plugin:myinfo =
  34. {
  35. name = "Jetpack",
  36. author = "Knagg0",
  37. description = "",
  38. version = PLUGIN_VERSION,
  39. url = "http://www.mfzb.de"
  40. };
  41.  
  42. public OnPluginStart()
  43. {
  44. AutoExecConfig();
  45.  
  46. CreateConVar("sm_jetpack_version", PLUGIN_VERSION, "", FCVAR_PLUGIN | FCVAR_REPLICATED | FCVAR_NOTIFY);
  47. sm_jetpack = CreateConVar("sm_jetpack", "1", "", FCVAR_PLUGIN | FCVAR_REPLICATED | FCVAR_NOTIFY);
  48. sm_jetpack_sound = CreateConVar("sm_jetpack_sound", g_sSound, "", FCVAR_PLUGIN);
  49. sm_jetpack_speed = CreateConVar("sm_jetpack_speed", "100", "", FCVAR_PLUGIN);
  50. sm_jetpack_volume = CreateConVar("sm_jetpack_volume", "0.5", "", FCVAR_PLUGIN);
  51.  
  52. RegConsoleCmd("+sm_jetpack", JetpackP, "", FCVAR_GAMEDLL);
  53. RegConsoleCmd("-sm_jetpack", JetpackM, "", FCVAR_GAMEDLL);
  54.  
  55. if((g_iLifeState = FindSendPropOffs("CBasePlayer", "m_lifeState")) == -1)
  56. LogError("Nem talalhato a CBasePlayer::m_lifeState offset!");
  57.  
  58. if((g_iMoveCollide = FindSendPropOffs("CBaseEntity", "movecollide")) == -1)
  59. LogError("Nem talalhato a CBaseEntity::movecollide offset");
  60.  
  61. if((g_iMoveType = FindSendPropOffs("CBaseEntity", "movetype")) == -1)
  62. LogError("Nem talalhato a CBaseEntity::movetype offset");
  63.  
  64. if((g_iVelocity = FindSendPropOffs("CBasePlayer", "m_vecVelocity[0]")) == -1)
  65. LogError("Nem talalhato a CBasePlayer::m_vecVelocity[0] offset");
  66. }
  67.  
  68. public OnMapStart()
  69. {
  70. g_fTimer = 0.0;
  71. g_iMaxClients = GetMaxClients();
  72. }
  73.  
  74. public OnConfigsExecuted()
  75. {
  76. GetConVarString(sm_jetpack_sound, g_sSound, sizeof(g_sSound));
  77. PrecacheSound(g_sSound, true);
  78. }
  79.  
  80. public OnGameFrame()
  81. {
  82. if(GetConVarBool(sm_jetpack) && g_fTimer < GetGameTime() - 0.075)
  83. {
  84. g_fTimer = GetGameTime();
  85.  
  86. for(new i = 1; i <= g_iMaxClients; i++)
  87. {
  88. if(g_bJetpacks[i])
  89. {
  90. if(!IsAlive(i)) StopJetpack(i);
  91. else AddVelocity(i, GetConVarFloat(sm_jetpack_speed));
  92. }
  93. }
  94. }
  95. }
  96.  
  97. public OnClientDisconnect(client)
  98. {
  99. StopJetpack(client);
  100. }
  101.  
  102. public Action:JetpackP(client, args)
  103. {
  104. if(GetConVarBool(sm_jetpack) && !g_bJetpacks[client] && IsAlive(client))
  105. {
  106. new Float:vecPos[3];
  107. GetClientAbsOrigin(client, vecPos);
  108. EmitSoundToAll(g_sSound, client, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, GetConVarFloat(sm_jetpack_volume), SNDPITCH_NORMAL, -1, vecPos, NULL_VECTOR, true, 0.0);
  109. SetMoveType(client, MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
  110. g_bJetpacks[client] = true;
  111. }
  112.  
  113. return Plugin_Continue;
  114. }
  115.  
  116. public Action:JetpackM(client, args)
  117. {
  118. StopJetpack(client);
  119. return Plugin_Continue;
  120. }
  121.  
  122. StopJetpack(client)
  123. {
  124. if(g_bJetpacks[client])
  125. {
  126. if(IsAlive(client)) SetMoveType(client, MOVETYPE_WALK, MOVECOLLIDE_DEFAULT);
  127. StopSound(client, SNDCHAN_AUTO, g_sSound);
  128. g_bJetpacks[client] = false;
  129. }
  130. }
  131.  
  132. SetMoveType(client, movetype, movecollide)
  133. {
  134. if(g_iMoveType == -1) return;
  135. SetEntData(client, g_iMoveType, movetype);
  136. if(g_iMoveCollide == -1) return;
  137. SetEntData(client, g_iMoveCollide, movecollide);
  138. }
  139.  
  140. AddVelocity(client, Float:speed)
  141. {
  142. if(g_iVelocity == -1) return;
  143.  
  144. new Float:vecVelocity[3];
  145. GetEntDataVector(client, g_iVelocity, vecVelocity);
  146.  
  147. vecVelocity[2] += speed;
  148.  
  149. TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, vecVelocity);
  150. }
  151.  
  152. bool:IsAlive(client)
  153. {
  154. if(g_iLifeState != -1 && GetEntData(client, g_iLifeState, 1) == LIFE_ALIVE)
  155. return true;
  156.  
  157. return false;
  158. }