Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. # This module enhances the vanilla "area trigger system":
  2. # 1. Ignoring wounded players.
  3. # 2. Ignoring vehicles, instead handling the players inside.
  4. # 3. Works using "Player Objects" rather than "Physical Objects"
  5.  
  6. import host
  7. import bf2
  8. import realitydebug as rdebug
  9.  
  10. # Public method - Call to create a new trigger.
  11. # Returns a unique ID belonging to the trigger.
  12. def createTrigger(obj, callback, radius, data, isHemisphere=False):
  13. # Create vanilla bf2 trigger
  14. if isHemisphere:
  15. trigid = bf2.triggerManager.createHemiSphericalTrigger(obj, onTrigger, '<<PCO>>', radius, data)
  16. else:
  17. trigid = bf2.triggerManager.createRadiusTrigger(obj, onTrigger, '<<PCO>>', radius, data)
  18.  
  19. # Create an object for it (Also adds it to a list)
  20. trigger(trigid, obj, callback)
  21.  
  22. # Return the ID
  23. return trigid
  24.  
  25.  
  26. # Public method - Destroy a trigger that was created here by its id
  27. def destroyTrigger(id, trigerPlayersInsideLeave=True):
  28. if id not in trigger.allTriggers:
  29. rdebug.debugMessage('Triggers: Cannot destroy unknown trigger %s' % id)
  30.  
  31. # Tell callback that players left the destroyed trigger
  32. if trigerPlayersInsideLeave:
  33. for p in trigger.allTriggers[id].playersInside:
  34. fireTrigger(id,p,0)
  35.  
  36. # For each player in the game, remove the trig id from his list
  37. for p in bf2.playerManager.getPlayers():
  38. p.areaList.discard(id)
  39.  
  40. del trigger.allTriggers[id]
  41.  
  42. bf2.triggerManager.destroy(id)
  43.  
  44.  
  45.  
  46. # Public method - Returns a reference of the set of players inside the trigger area.
  47. # The set is kept up to date at all times.
  48. def getPlayersInArea(id):
  49. if id not in trigger.allTriggers:
  50. rdebug.debugMessage('GetPlayersInArea - Triggers: Unknown trigger %s requested' % id)
  51. return None
  52.  
  53. return trigger.allTriggers[id].playersInside
  54.  
  55.  
  56. def init():
  57. host.registerHandler('PlayerRevived', onRevive, 1)
  58. host.registerHandler('PlayerKilled', onWound, 1)
  59. host.registerHandler('PlayerConnect', onConnect, 1)
  60. host.registerHandler('PlayerDeath', onDeath, 1)
  61.  
  62. ###### PRIVATE METHODS DO NOT CALL FROM OUTSDIDE
  63.  
  64. # Initialize the area list set
  65. # The area list is the list of trigger areas the player's physical object is in.
  66. def onConnect(playerObject):
  67. playerObject.areaList = set()
  68.  
  69. # On death, Player is nowhere, clear the list.
  70. def onDeath(playerObject, soldierObject):
  71. playerObject.areaList.clear()
  72.  
  73. # On revive, report that player has entered the areas his physical object is in
  74. def onRevive(revivedPlayerObject, medicPlayerObject):
  75. for triggerID in revivedPlayerObject.areaList:
  76. fireTrigger(triggerID, revivedPlayerObject, 1)
  77.  
  78. # On wounded, report that player has left the areas he's in
  79. def onWound(victimPlayerObject, attackerPlayerObject, weaponObject, assists, victimSoldierObject):
  80. for triggerID in victimPlayerObject.areaList:
  81. fireTrigger(triggerID, victimPlayerObject, 0)
  82.  
  83. # Called when the vanilla trigger fires, filters it
  84. def onTrigger(triggerID, triggerObj, vehicleObj, entered):
  85. # Here's the tricky part: if the vehicle has a parent it should be ignored,
  86. # the parent will also fire the events and we can get the list of players through occupying players of the parent
  87. if vehicleObj.getParent():
  88. return
  89.  
  90. for playerObj in vehicleObj.getOccupyingPlayers():
  91. if entered:
  92. playerObj.areaList.add(triggerID)
  93. else:
  94. playerObj.areaList.discard(triggerID)
  95.  
  96. # Only fire events if player is not wounded
  97. if playerObj.isAlive() and not playerObj.isManDown():
  98. fireTrigger(triggerID, playerObj, entered)
  99.  
  100. # Calls trigger's Callback function
  101. def fireTrigger(id, Player, Entered):
  102. if id not in trigger.allTriggers:
  103. rdebug.debugMessage('fireTrigger: Unknown trigger %s requested' % id)
  104. return
  105.  
  106. trig = trigger.allTriggers[id]
  107. # If Entered, but player is already inside, don't fire the event (Happens when player changes seats while in radius)
  108. if Entered:
  109. if Player in trig.playersInside:
  110. return
  111. trig.playersInside.add(Player)
  112. trig.callback(id, Player, 1)
  113.  
  114. # If leaving, but player is not inside, don't fire the event (TODO can this ever happen?)
  115. else:
  116. if Player not in trig.playersInside:
  117. rdebug.debugMessage('player %s left something hes not inside' % Player.getName())
  118. return
  119. trig.playersInside.discard(Player)
  120. trig.callback(id, Player, 0)
  121.  
  122. class trigger(object):
  123. # Static, Dictionary of all the active triggers created by this module by ID
  124. allTriggers = {}
  125.  
  126. def __init__(self, id, triggerobj, callback):
  127. self.triggerobj = triggerobj
  128. self.callback = callback
  129. self.triggerid = id
  130. self.playersInside = set()
  131. trigger.allTrigger[id] = self
  132.  
  133.  
  134.  
  135. # Experiments:
  136.  
  137. # Entering empty vehicle while in radius:
  138. # Vehicle Driver seat Object Enter area
  139. # Soldier Object leave area
  140.  
  141. # Changing from driver seat while in radius:
  142. # Soldier Object enter area
  143. # Vehicle new Seat enter area
  144. # Soldier Object leave area
  145.  
  146. # Changing to driver seat while in radius:
  147. # Soldier Object enter area
  148. # Vehicle new Seat leave area
  149. # Soldier Object leave area
  150.  
  151. # Leave vehicle (now empty) while in radius:
  152. # Soldier Enter area
  153. # Vehicle Leave area
  154.  
  155. # Trigger's object is destroyed:
  156. # No events are called anymore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement