#------------------------------------------------------------------------------- # Name: towObjects.py # Purpose: This file will allow the user to hook up objects to the vehicle # he is currently manning. # # Author: Casper de Wit # # Created: 27-03-2010 # Copyright: (c) Casper de Wit 2010 # Licence: CC free for all!! #------------------------------------------------------------------------------- ''' DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY # listen to key events, this will be a interface in the end import bf2 import bf2.Timer import host import math import game.utilities def keyEvent(): if key event == tow gun: if checkForGun(6pounder): goTow(playerObject, gun): else print no gun in range, player.id.getName() continue issueing tow events for all sorts of objects #gunType = var array with all gun types #maxGunRange = var float, max range a gun can be for it to be towwed def checkForGun(gunType): for each gameobject guntype in gameobjects checkRange(maxGunRange) def checkRange(limit, object): check if object is within a certain range, use function from game.utilities def goTow(player, object): start a updateTimer(every 5 ms) first, turn the object to the player then, get the distance to the player object then, close the gap between the object and the player(move) envision the horros DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY DUMMY''' import bf2 import bf2.Timer import host import math import game.utilities from game.gameplayPlugin import base maxDistance = 5.3 minDistance = 4.0 hookDistance = 4.0 springStrength = 100 updateRate = 100 updateTimer = None towHealth = 0 oldPlayerPosition = (0.0, 0.0, 0.0) newPlayerPosition = (0.0, 0.0, 0.0) playerRotation = 0.0 objectRotation = 0.0 #set g_debug to 1 for debugging tracers g_debug = 0 def init(): print '[towObjects.py init] REGISTERING EVENT HANDLERS ' #host.registerHandler('ChatMessage', keyEvent) #host.registerGameStatusHandler(onGameStatusChange) def onGameStatusChange(status): print '[towObjects.py onGameStatusChange] Gamestatus change: ', status def keyEvent(playerID, textMessage, onChannel, playerStatus): #print '[towObjects.py keyEvent] received text message: ', textMessage if playerID == -1: playerID = 255 gunObject = '' player = bf2.playerManager.getPlayerByIndex(playerID) if textMessage == 'z': destroyTimer() return if textMessage == 'a': gun = checkForGun(player, '6pdr_mkiv') if gun != None: goTow(player, gun) else: return #print '[towObjects.py keyEvent] No gun in range for player: ', player def thisIsTestStuff(): print '[towObjects.py thisIsTestStuff] I have been talked to!' #BACKUP STUFF #g_objects = bf2.objectManager.getObjectsOfType('dice.hfe.world.ObjectTemplate.ObjectSpawner') #BACKUP STUFF def checkForGun(player, gunType): g_objects = bf2.objectManager.getObjectsOfType('dice.hfe.world.ObjectTemplate.PlayerControlObject') selectedObject = None range = 0.0 print '[towObjects.py checkForGun] g_objects length ', len(g_objects) for obj in g_objects: templateName = obj.templateName if templateName == gunType: print '[towObjects.py checkForGun] obj in g_objects gunType found: ', templateName selectedObject = obj if selectedObject.isValid(): distance = findRange(player, selectedObject) if distance < maxDistance: print '[towObjects.py checkForGun] Found towing object: ', selectedObject, ' at range ', distance return selectedObject def goTow(player, gunObject): print '[towObjects.py goTow] attempt tow for player: ', player, ' and object: ', gunObject data = (player, gunObject) towHealth = gunObject.getDamage() updateTimer = bf2.Timer(physicsUpdateTimeFire, 0.01, 1, data) updateTimer.setRecurring(0.01) #find out rotation from object to player def physicsUpdateTimeFire(data): player = data[0] gunObject = data[1] #gunObject.setDamage(towHealth) distance = findRange(player, gunObject) if distance > maxDistance: destroyTimer() #updateTimer.destroy() #updateTimer = None translation = findTranslation(player, gunObject) gunObject.setPosition(translation) rotation = findRotation(player, gunObject) gunObject.setRotation(rotation) def destroyTimer(): print '[towObjects.py destroyTimer] received instructions' if updateTimer != None: updateTimer.destroy() updateTimer = None print '[towObjects.py destroyTimer] timer destroyed' return def findRange(player, obj2): playerPos = player.getVehicle().getPosition() objPos = obj2.getPosition() dx = playerPos[0] - objPos[0] dz = playerPos[2] - objPos[2] exponentDx = (dx * dx) exponentDz = (dz * dz) exponentFin = exponentDx + exponentDz distance = math.sqrt(exponentFin) if g_debug == 1: print '[towObjects.py findRange] attemp to find range between player, obj ', player, ' ', obj2 print '[towObjects.py findRange] player position ', player.getVehicle().getPosition() print '[towObjects.py findRange] object position ', obj2.getPosition() print '[towObjects.py findRange] dx ', dx print '[towObjects.py findRange] dz ', dz print '[towObjects.py findRange] exponent ', exponentFin print '[towObjects.py findRange] distance obj1, obj2 ', distance return distance def findRotation(player, object): playerPosition = player.getVehicle().getPosition() playerRotation = player.getVehicle().getRotation() objectPosition = object.getPosition() objectRotation = object.getRotation() print 'ARRRR objectRotation ', objectRotation[0] print 'ARRRR playerRotation ',playerRotation[0] playerRotation[0] dx = playerPosition[0] - objectPosition[0] dy = (playerPosition[1] + 0.2) - objectPosition[1] dz = playerPosition[2] - objectPosition[2] objectDistance = math.sqrt((dx * dx) + (dz * dz)) angleXrad = math.atan2(dx, dz) angleXdeg = angleXrad * (180 / math.pi) objectYDistance = math.sqrt((objectDistance) + (dy * dy)) angleYrad = math.atan2(dy, objectYDistance) angleYdeg = angleYrad * (180 / math.pi) angleX = angleXdeg + 180.0 angleY = angleYdeg angleZ = objectRotation[2] absRotVal = math.fabs(playerRotation[0] - objectRotation[0]) print '[towObjects.py findRotation] absRotval: ', absRotVal objRot = (angleX, angleY, angleZ) finalRotation = objRot if g_debug == 1: print '[towObjects.py findRotation] angle in radians between player and object: ', angleRad print '[towObjects.py findRotation] angle in degree between player and object: ', angleDeg + 180.0 print '[towObjects.py findRotation] player Rotation ', player.getVehicle().getRotation() print '[towObjects.py findRotation] distance to object ', objectDistance return finalRotation def findTranslation(player, object): objectPosition = object.getPosition() playerPosition = player.getVehicle().getPosition() dx = playerPosition[0] - objectPosition[0] dz = playerPosition[2] - objectPosition[2] objectDistance = math.sqrt((dx * dx) + (dz * dz)) translateDistance = objectDistance - minDistance angleXrad = math.atan2(dx, dz) xTranslation = (math.cos(angleXrad) * translateDistance) / springStrength zTranslation = -(math.sin(angleXrad) * translateDistance) / springStrength translation = (objectPosition[0] - xTranslation, objectPosition[1] - 0.01, objectPosition[2] - zTranslation) #Y translate for human: playerPosition - 0.291 #Y translate for willys: playerPosition - 1.291 #translation = (objectPosition[0] - xTranslation, objectPosition[1] - 0.05,objectPosition[2] - zTranslation) if g_debug == 1: print '[towObjects.py findTranslation] playerPosition ', playerPosition print '[towObjects.py findTranslation] objPosition ', objPosition print '[towObjects.py findTranslation] translateDistance', translateDistance print '[towObjects.py findTranslation] minDistance', minDistance print '[towObjects.py findTranslation] objectDistance', objectDistance return translation init()