HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1.  
  2. #include <amxmodx>
  3. #include <amxmisc>
  4. #include <fakemeta>
  5. #include <hamsandwich>
  6. #include <xs>
  7.  
  8. new const Plugin[] = "Easy Weapon Trade"
  9. new const Author[] = "joaquimandrade and ConnorMcLeod"
  10. new const Version[] = "1.0"
  11.  
  12. const m_pLastPrimaryItem = 368
  13. const m_pLastSecondaryItem = 369
  14. const m_pActiveItem = 373
  15.  
  16. const m_iId = 43
  17. const m_iIdLinuxOffset = 4
  18.  
  19. const MaxSlots = 32
  20.  
  21. new IsTryingTradeWith[MaxSlots+1]
  22. new IsTradingWith[MaxSlots+1]
  23. new IsTradingItem[MaxSlots+1]
  24. new WeaponType:IsTradingWeaponType[MaxSlots+1]
  25. new Float:LastTradeStartTime[MaxSlots+1]
  26. new Float:LastTradeEndTime[MaxSlots+1]
  27.  
  28. new Float:TradeMaxDistance
  29. new CanTradeDiffCategoryWeapons
  30. new TradeDelay
  31. new Float:TradeCoolDown
  32.  
  33. new MsgBarTimeIndex
  34.  
  35. enum WeaponType
  36. {
  37. Primary,
  38. Secondary
  39. }
  40.  
  41. static PlayerWeaponsOffsets[WeaponType] = {m_pLastPrimaryItem,m_pLastSecondaryItem}
  42.  
  43. public plugin_init()
  44. {
  45. register_plugin(Plugin,Version,Author)
  46.  
  47. RegisterHam(Ham_ObjectCaps,"player","playerUse")
  48.  
  49. CanTradeDiffCategoryWeapons = get_pcvar_num( register_cvar("easy_weapon_trade_diff","1")) //A cvar a cserét határozza meg, tehát a játékos képes elcserélni Elsődleges fegyverét egy Másodlagosra.
  50. TradeDelay = get_pcvar_num( register_cvar("easy_weapon_trade_delay","1")) // A csere késés/várakoztatási ideje.
  51. TradeCoolDown = get_pcvar_float( register_cvar("easy_weapon_trade_cooldown","3.0")) //Az időt határozza meg, melytől újra lehet cserélni.
  52. TradeMaxDistance = get_pcvar_float( register_cvar("easy_weapon_trade_maxdist","30.0")) //A távolságot határozza meg, melytől a játékosok tudnak cserélni.
  53.  
  54. MsgBarTimeIndex = get_user_msgid("BarTime")
  55.  
  56. register_cvar("easyWeaponTrade",Version,FCVAR_SERVER|FCVAR_SPONLY);
  57. }
  58.  
  59. getLookingAt(id)
  60. {
  61. static Float:start[3],Float:viewOffset[3],Float:path[3],Float:dest[3]
  62.  
  63. pev(id,pev_origin,start);
  64. pev(id,pev_view_ofs,viewOffset);
  65. xs_vec_add(start,viewOffset,start);
  66.  
  67. pev(id,pev_v_angle,path);
  68. engfunc(EngFunc_MakeVectors,path);
  69. global_get(glb_v_forward,path);
  70.  
  71. xs_vec_mul_scalar(path,TradeMaxDistance,dest);
  72. xs_vec_add(start,dest,dest);
  73.  
  74. engfunc(EngFunc_TraceLine,start,dest,0,id,0);
  75.  
  76. new hit = get_tr2(0,TR_pHit)
  77.  
  78. return 1 <= hit <= MaxSlots ? hit : 0
  79. }
  80.  
  81. checkTrade(id)
  82. {
  83. if(!IsTradingWith[id])
  84. {
  85. new Float:currentTime = get_gametime()
  86.  
  87. if(currentTime >= (LastTradeEndTime[id] + TradeCoolDown))
  88. {
  89. new idLookingAt = getLookingAt(id)
  90.  
  91. if(idLookingAt && (get_user_team(id) == get_user_team(idLookingAt)) && currentTime >= (LastTradeEndTime[idLookingAt] + TradeCoolDown))
  92. {
  93. if((IsTryingTradeWith[id] = idLookingAt) && (IsTryingTradeWith[idLookingAt] == id))
  94. {
  95. new activeItem = get_pdata_cbase(id,m_pActiveItem)
  96. new lookingAtActiveItem = get_pdata_cbase(idLookingAt,m_pActiveItem)
  97.  
  98. new bool:canTrade
  99.  
  100. if(CanTradeDiffCategoryWeapons)
  101. {
  102. new bool:idCanTrade
  103. new bool:lookingAtCanTrade
  104.  
  105. for(new WeaponType:i=WeaponType:Primary;i<WeaponType;i++)
  106. {
  107. if(activeItem == get_pdata_cbase(id,PlayerWeaponsOffsets[i]))
  108. {
  109. IsTradingWeaponType[id] = i
  110. idCanTrade = true
  111. }
  112. if(lookingAtActiveItem == get_pdata_cbase(idLookingAt,PlayerWeaponsOffsets[i]))
  113. {
  114. IsTradingWeaponType[idLookingAt] = i
  115. lookingAtCanTrade = true
  116. }
  117. }
  118.  
  119. canTrade = idCanTrade && lookingAtCanTrade
  120. }
  121. else
  122. {
  123. for(new WeaponType:i=WeaponType:Primary;i<=WeaponType;i++)
  124. {
  125. if((activeItem == get_pdata_cbase(id,PlayerWeaponsOffsets[i])) && (lookingAtActiveItem == get_pdata_cbase(idLookingAt,PlayerWeaponsOffsets[i])))
  126. {
  127. canTrade = true
  128. break;
  129. }
  130. }
  131. }
  132.  
  133. if(canTrade)
  134. {
  135. if(TradeDelay)
  136. {
  137. startTrade(id,idLookingAt,activeItem,lookingAtActiveItem,TradeDelay)
  138. }
  139. else
  140. {
  141. finishTrade(id,idLookingAt)
  142. }
  143. }
  144. }
  145. }
  146. }
  147. }
  148. else
  149. {
  150. new idLookingAt = getLookingAt(id)
  151.  
  152. if(idLookingAt)
  153. {
  154. new activeItem = get_pdata_cbase(id,m_pActiveItem)
  155. new lookingAtActiveItem = get_pdata_cbase(idLookingAt,m_pActiveItem)
  156.  
  157. if((IsTradingWith[id] != idLookingAt) || (IsTradingWith[idLookingAt] != getLookingAt(idLookingAt)) || (lookingAtActiveItem != IsTradingItem[idLookingAt]) || (activeItem != IsTradingItem[id]))
  158. {
  159. stopTrade(id,IsTradingWith[id])
  160. }
  161. else if(get_gametime() >= (LastTradeStartTime[id] + TradeDelay))
  162. {
  163. finishTrade(id,IsTradingWith[id])
  164. }
  165. }
  166. }
  167. }
  168.  
  169. startTrade(id,id2,activeItem,activeItem2,tradeDelay)
  170. {
  171. IsTryingTradeWith[id] = IsTryingTradeWith[id2] = 0
  172.  
  173. LastTradeStartTime[id] = LastTradeStartTime[id2] = get_gametime()
  174.  
  175. IsTradingItem[id] = activeItem
  176. IsTradingItem[id2] = activeItem2
  177.  
  178. IsTradingWith[id] = id2
  179. IsTradingWith[id2] = id
  180.  
  181. showBar(id,tradeDelay)
  182. showBar(id2,tradeDelay)
  183. }
  184.  
  185. finishTrade(id,id2)
  186. {
  187. ExecuteHam(Ham_RemovePlayerItem,id,IsTradingItem[id])
  188. ExecuteHam(Ham_RemovePlayerItem,id2,IsTradingItem[id2])
  189.  
  190. set_pdata_cbase(id,PlayerWeaponsOffsets[IsTradingWeaponType[id]],-1)
  191. set_pdata_cbase(id2,PlayerWeaponsOffsets[IsTradingWeaponType[id2]],-1)
  192.  
  193. user_has_weapon(id,get_pdata_int(IsTradingItem[id],m_iId,m_iIdLinuxOffset),0)
  194. user_has_weapon(id2,get_pdata_int(IsTradingItem[id2],m_iId,m_iIdLinuxOffset),0)
  195.  
  196. if(IsTradingWeaponType[id] != IsTradingWeaponType[id2])
  197. {
  198. static weaponClass[] = "weapon_smokegrenade"
  199.  
  200. new oldItem = get_pdata_cbase(id,PlayerWeaponsOffsets[IsTradingWeaponType[id2]])
  201.  
  202. if(oldItem != -1)
  203. {
  204. pev(oldItem,pev_classname,weaponClass,charsmax(weaponClass))
  205. engclient_cmd(id,"drop",weaponClass)
  206. }
  207.  
  208. new oldItem2 = get_pdata_cbase(id2,PlayerWeaponsOffsets[IsTradingWeaponType[id]])
  209.  
  210. if(oldItem2 != -1)
  211. {
  212. pev(oldItem2,pev_classname,weaponClass,charsmax(weaponClass))
  213. engclient_cmd(id2,"drop",weaponClass)
  214. }
  215. }
  216.  
  217. ExecuteHam(Ham_AddPlayerItem,id,IsTradingItem[id2])
  218. ExecuteHam(Ham_AddPlayerItem,id2,IsTradingItem[id])
  219.  
  220. stopTrade(id,id2)
  221.  
  222. LastTradeEndTime[id] = LastTradeEndTime[id2] = get_gametime()
  223. }
  224.  
  225. stopTrade(id,id2)
  226. {
  227. IsTradingWith[id] = IsTradingWith[id2] = 0
  228.  
  229. showBar(id,0)
  230. showBar(id2,0)
  231. }
  232.  
  233. showBar(id,barTime)
  234. {
  235. message_begin(MSG_ONE_UNRELIABLE, MsgBarTimeIndex,.player=id)
  236. write_short(barTime)
  237. message_end()
  238. }
  239.  
  240. public playerUse(id)
  241. {
  242. if(is_user_connected(id))
  243. {
  244. if(pev(id,pev_button) & IN_USE)
  245. {
  246. checkTrade(id)
  247. }
  248. else if(IsTradingWith[id])
  249. {
  250. stopTrade(id,IsTradingWith[id])
  251. }
  252. }
  253. }