Суббота, 18.05.2024, 23:00
Welcome Гость | RSS
Personal Website of Dmitry2501
Home Page | Количество очков возраждения - Форум | Registration | Login
[ New messages · Members · Forum rules · Search · RSS ]
  • Страница 1 из 1
  • 1
Форум » Игровой раздел » BattleField » Количество очков возраждения (BattleField 2)
Количество очков возраждения
DmitryDate: Среда, 27.01.2010, 16:15 | Post # 1
Создатель сайта
Group: Создатель
Posts: 350
Статус: Offline
1 Открываем блокнотом gpm_cq.py находящийся в Battlefield 2/mods/bf2/python/game/gamemodes
2 Ищем строку return int(mapDefaultTickets * (bf2.serverSettings.getTicketRatio() / 100.0))
3 Чем меньше цифра в скобках, тем больше очков возрождения. Например 25.0 даст 800 билетов на сторону.
4 Ниже приведен текст оригинального файла с отмеченной цветом строкой:

# conquest
TAKEOVERTYPE_CAPTURE = 1
TAKEOVERTYPE_NEUTRALIZE = 2
SCORE_CAPTURE = 2
SCORE_NEUTRALIZE = 2
SCORE_CAPTUREASSIST = 1
SCORE_NEUTRALIZEASSIST = 1
SCORE_DEFEND = 1
Top = 0
Middle = 1
Bottom = 2
import host
import bf2
import math
from game.scoringCommon import addScore, RPL
from bf2 import g_debug

g_controlPoints = [] # cache, as this map won't change
def init():
# events hook
host.registerGameStatusHandler(onGameStatusChanged)
if host.sgl_getIsAIGame() == 1:
host.sh_setEnableCommander(1)
else:
host.sh_setEnableCommander(1)

host.registerHandler('TimeLimitReached', onTimeLimitReached, 1)

if g_debug: print "gpm_cq.py initialized"

def deinit():
bf2.triggerManager.destroyAllTriggers()
global g_controlPoints
g_controlPoints = []
host.unregisterGameStatusHandler(onGameStatusChanged)
if g_debug: print "gpm_cq.py uninitialized"

def onGameStatusChanged(status):
if g_debug: print "onGameStatusChanged:", status

global g_controlPoints
if status == bf2.GameStatus.Playing:

# add control point triggers
g_controlPoints = bf2.objectManager.getObjectsOfType('dice.hfe.world.ObjectTemplate.ControlPoint')
for obj in g_controlPoints:
radius = float(obj.getTemplateProperty('radius'))
isHemi = int(obj.cp_getParam('isHemisphere'))
if isHemi != 0:
id = bf2.triggerManager.createHemiSphericalTrigger(obj, onCPTrigger, '<<PCO>>', radius, (1, 2, 3))
else:
id = bf2.triggerManager.createRadiusTrigger(obj, onCPTrigger, '<<PCO>>', radius, (1, 2, 3))
obj.triggerId = id
obj.lastAttackingTeam = 0
if obj.cp_getParam('team') > 0:
obj.flagPosition = Top
else:
obj.flagPosition = Bottom

host.registerHandler('ControlPointChangedOwner', onCPStatusChange)

# setup ticket system
ticketsTeam1 = calcStartTickets(bf2.gameLogic.getDefaultTickets(1))
ticketsTeam2 = calcStartTickets(bf2.gameLogic.getDefaultTickets(2))

if g_debug: print "%d %d" % (ticketsTeam1, ticketsTeam2)

bf2.gameLogic.setTickets(1, ticketsTeam1)
bf2.gameLogic.setTickets(2, ticketsTeam2)

bf2.gameLogic.setTicketState(1, 0)
bf2.gameLogic.setTicketState(2, 0)

bf2.gameLogic.setTicketLimit(1, 1, 0)
bf2.gameLogic.setTicketLimit(2, 1, 0)
bf2.gameLogic.setTicketLimit(1, 2, 10)
bf2.gameLogic.setTicketLimit(2, 2, 10)
bf2.gameLogic.setTicketLimit(1, 3, int(ticketsTeam1*0.1))
bf2.gameLogic.setTicketLimit(2, 3, int(ticketsTeam2*0.1))
bf2.gameLogic.setTicketLimit(1, 4, int(ticketsTeam1*0.2))
bf2.gameLogic.setTicketLimit(2, 4, int(ticketsTeam1*0.2))

host.registerHandler('TicketLimitReached', onTicketLimitReached)
updateTicketLoss()

# player events
host.registerHandler('PlayerDeath', onPlayerDeathCQ)
host.registerHandler('PlayerKilled', onPlayerKilledCQ)
host.registerHandler('PlayerRevived', onPlayerRevived)
host.registerHandler('PlayerSpawn', onPlayerSpawn)
host.registerHandler('EnterVehicle', onEnterVehicle)
host.registerHandler('ExitVehicle', onExitVehicle)

if g_debug: print "Conquest gamemode initialized."
else:
bf2.triggerManager.destroyAllTriggers()
g_controlPoints = []

def calcStartTickets(mapDefaultTickets):
return int(mapDefaultTickets * (bf2.serverSettings.getTicketRatio() / 100.0))

def onTimeLimitReached(value):
if g_debug: print "Time limit reached"
team1tickets = bf2.gameLogic.getTickets(1)
team2tickets = bf2.gameLogic.getTickets(2)
winner = 0
victoryType = 0
if team1tickets > team2tickets:
winner = 1
victoryType = 3
elif team2tickets > team1tickets:
winner = 2
victoryType = 3
host.sgl_endGame(winner, victoryType)

# update ticket system
def updateTicketLoss():
areaValueTeam1 = 0
areaValueTeam2 = 0
totalAreaValue = 0
numCpsTeam0 = 0
numCpsTeam1 = 0
numCpsTeam2 = 0
# calculate control point area value for each team
for obj in g_controlPoints:
team = obj.cp_getParam('team')
if team == 1:
areaValueTeam1 += obj.cp_getParam('areaValue', team)
totalAreaValue += areaValueTeam1
numCpsTeam1 += 1
elif team == 2:
areaValueTeam2 += obj.cp_getParam('areaValue', team)
totalAreaValue += areaValueTeam2
numCpsTeam2 += 1
else:
numCpsTeam0 += 1
totalAreaValue += 0

if g_debug: print "Team 1 has %d CPs, area value %d" % (numCpsTeam1, areaValueTeam1)
if g_debug: print "Team 2 has %d CPs, area value %d" % (numCpsTeam2, areaValueTeam2)
if g_debug: print "Neutral has %d CPs" % (numCpsTeam0)

# check if a team has no control points
if numCpsTeam1 == 0 or numCpsTeam2 == 0:
if numCpsTeam1 == 0:
losingTeam = 1
winningTeam = 2
else:
losingTeam = 2
winningTeam = 1

# check if there is anyone alive
foundLivingPlayer = False
for p in bf2.playerManager.getPlayers():
if p.getTeam() == losingTeam and p.isAlive():
foundLivingPlayer = True
break

if not foundLivingPlayer:
ticketLossPerSecond = bf2.gameLogic.getDefaultTicketLossAtEndPerMin()
bf2.gameLogic.setTicketChangePerSecond(losingTeam, -ticketLossPerSecond)
bf2.gameLogic.setTicketChangePerSecond(winningTeam, 0)

if g_debug: print "Racing tickets."
return

# update ticket loss
team1AreaOverweight = areaValueTeam1 - areaValueTeam2
percentualOverweight = 1.0
if totalAreaValue != 0:
percentualOverweight = abs(team1AreaOverweight / totalAreaValue)

ticketLossPerSecTeam1 = calcTicketLossForTeam(1, areaValueTeam2, -team1AreaOverweight)
ticketLossPerSecTeam2 = calcTicketLossForTeam(2, areaValueTeam1, team1AreaOverweight)
bf2.gameLogic.setTicketChangePerSecond(1, -ticketLossPerSecTeam1)
bf2.gameLogic.setTicketChangePerSecond(2, -ticketLossPerSecTeam2)
if g_debug: print "New ticketloss team1=%f (team1areaOW=%d)" % (ticketLossPerSecTeam1, team1AreaOverweight)
if g_debug: print "New ticketloss team2=%f (team1areaOW=%d)" % (ticketLossPerSecTeam2, team1AreaOverweight)

# actual ticket loss calculation function
def calcTicketLossForTeam(team, otherTeamAreaValue, otherTeamAreaOverweight):
if otherTeamAreaValue >= 100 and otherTeamAreaOverweight > 0:
ticketLossPerSecond = (bf2.gameLogic.getDefaultTicketLossPerMin(team) / 60.0) * (otherTeamAreaOverweight / 100.0)
return ticketLossPerSecond
else:
return 0

DOWNWARDS = -1
UPWARDS = 1
# called when tickets reach a predetermined limit (negativ value means that the tickets have become less than the limit)
def onTicketLimitReached(team, limitId):
if (limitId == -1):
if (team == 1):
winner = 2

elif (team == 2):
winner = 1

bf2.gameLogic.setTicketState(1, 0)
bf2.gameLogic.setTicketState(2, 0)

host.sgl_endGame(winner, 3)
#update ticket state
else:
updateTicketWarning(team, limitId)

# called when the ticket state should be updated (for triggering messages and sounds based on tickets left)
def updateTicketWarning(team, limitId):

oldTicketState = bf2.gameLogic.getTicketState(team)
newTicketState = 0

if (oldTicketState >= 10):
newTicketState = 10

if (limitId == -2):
newTicketState = 10

elif (limitId == 2):
newTicketState = 0

elif (limitId == -3):
newTicketState += 2

elif (limitId == -4):
newTicketState += 1

if (oldTicketState != newTicketState):
bf2.gameLogic.setTicketState(team, newTicketState)

# called when someone enters or exits cp radius
def onCPTrigger(triggerId, cp, vehicle, enter, userData):
if not cp.isValid(): return

# can this cp be captured at all?
if cp.cp_getParam('unableToChangeTeam') != 0:
return

if enter:
for p in vehicle.getOccupyingPlayers():
cp = getOccupyingCP(p)
if cp != None:
if not p.getIsInsideCP():
if g_debug: print "Resetting enterPctAt for player ", p.getName()
p.enterCpAt = host.timer_getWallTime()

if vehicle:
for p in vehicle.getOccupyingPlayers():
p.setIsInsideCP(enter)

# count people in radius
team1Occupants = 0
team2Occupants = 0

#if g_debug: print "players in cp area:"
pcos = bf2.triggerManager.getObjects(cp.triggerId)
for o in pcos:
if not o: continue # dep: you can get None in the result tuple when the host can't figure out what object left the trigger
if o.getParent(): continue # jlo: getOccupyingPlayers returns all players downwards in the hierarchy, so dont count them twice
#if g_debug: print "pco: ", o.templateName
for p in o.getOccupyingPlayers():
#if g_debug: print "onCPTrigger: %s %s %s" % (p.getName(), mode, o.templateName)
if p.isAlive() and not p.isManDown():
#if g_debug: print "Player %s is alive and in radius." % p.getName()

if not p.killed:
if p.getTeam() == 1:
team1Occupants += 1
elif p.getTeam() == 2:
team2Occupants += 1

# determine who is actually getting it
team1OverWeight = team1Occupants - team2Occupants
attackOverWeight = 0

if team1OverWeight > 0:
attackingTeam = 1
elif team1OverWeight < 0:
attackingTeam = 2
else:
attackingTeam = 0

if team1Occupants == 0 and team2Occupants == 0:

# nobody here, slowly go back to owning team
if cp.cp_getParam('team') == 0:
attackOverWeight = -0.5
else:
attackOverWeight = 0.5

timeToChangeControl = cp.cp_getParam('timeToLoseControl')

else:

# raise flag if already ours, or at bottom and neutral. Otherwise lower first.
if cp.cp_getParam('flag') == attackingTeam or (cp.flagPosition == Bottom and cp.cp_getParam('team') == 0):

# our flag, raise
attackOverWeight = abs(team1OverWeight)
timeToChangeControl = cp.cp_getParam('timeToGetControl')
else:
# other team raised flag, lower first
attackOverWeight = - abs(team1OverWeight)
timeToChangeControl = cp.cp_getParam('timeToLoseControl')

if cp.cp_getParam('onlyTakeableByTeam') != 0 and cp.cp_getParam('onlyTakeableByTeam') != attackingTeam:
return
# flag can only be changed when at bottom
if cp.flagPosition == Bottom:
cp.cp_setParam('flag', attackingTeam)
# calculate flag raising/lowering speed
if timeToChangeControl > 0:
takeOverChangePerSecond = 1.0 * attackOverWeight / timeToChangeControl
else:
takeOverChangePerSecond = 0.0
if (cp.flagPosition == Top and takeOverChangePerSecond > 0) or (cp.flagPosition == Bottom and takeOverChangePerSecond < 0):
takeOverChangePerSecond = 0.0
if abs(takeOverChangePerSecond) > 0:
cp.flagPosition = Middle
cp.cp_setParam('takeOverChangePerSecond', takeOverChangePerSecond)

# called when a control point flag reached top or bottom
def onCPStatusChange(cp, top):

playerId = -1
takeoverType = -1
newTeam = -1
scoringTeam = -1

if top: cp.flagPosition = Top
else: cp.flagPosition = Bottom

# determine capture / neutralize / defend
if cp.cp_getParam('team') != 0:

if top:
# regained flag, do nothing
if g_debug: print "Controlpoint fully returned to owning team"

else:
# neutralize
newTeam = 0
if cp.cp_getParam('team') == 1:
scoringTeam = 2
else:
scoringTeam = 1

takeoverType = TAKEOVERTYPE_NEUTRALIZE
if g_debug: print "Controlpoint neutralized by team %d" % scoringTeam

else:

if top:
# capture
newTeam = cp.cp_getParam('flag')
scoringTeam = newTeam
takeoverType = TAKEOVERTYPE_CAPTURE
if g_debug: print "Controlpoint captured by team %d" % newTeam

else:
# hit bottom, but still neutral
if g_debug: print "Neutral flag hit bottom"

# scoring
if takeoverType > 0:
pcos = bf2.triggerManager.getObjects(cp.triggerId)

# count number of players
scoringPlayers = []
firstPlayers = []
for o in pcos:
if not o.getOccupyingPlayers:
if g_debug: print "sanity check: got a non-pco object as a result of a pco trigger. type=", o.templateName

for p in o.getOccupyingPlayers():
if p.isAlive() and not p.isManDown() and p.getTeam() == scoringTeam:
if len(firstPlayers) == 0 or p.enterCpAt < firstPlayers[0].enterCpAt:
firstPlayers = [p]
elif p.enterCpAt == firstPlayers[0].enterCpAt:
firstPlayers += [p]

if not p in scoringPlayers:
scoringPlayers += [p]

# deal score
for p in scoringPlayers:
oldScore = p.score.score;
if takeoverType == TAKEOVERTYPE_CAPTURE:
if p in firstPlayers:
p.score.cpCaptures += 1
addScore(p, SCORE_CAPTURE, RPL)
bf2.gameLogic.sendGameEvent(p, 12, 0) #12 = Conquest, 0 = Capture
playerId = p.index
else:
p.score.cpAssists += 1
addScore(p, SCORE_CAPTUREASSIST, RPL)
bf2.gameLogic.sendGameEvent(p, 12, 2) #12 = Conquest, 2 = Assist

elif takeoverType == TAKEOVERTYPE_NEUTRALIZE:
if p in firstPlayers:
p.score.cpNeutralizes += 1
addScore(p, SCORE_NEUTRALIZE, RPL)
bf2.gameLogic.sendGameEvent(p, 12, 3) #12 = Conquest, 3 = Neutralize
else:
p.score.cpNeutralizeAssists += 1
addScore(p, SCORE_NEUTRALIZEASSIST, RPL)
bf2.gameLogic.sendGameEvent(p, 12, 4) #12 = Conquest, 4 = Neutralize assist

if g_debug: print "Giving player %s score %d" % (p.getName(), p.score.score - oldScore)

# immediate ticket loss for opposite team
enemyTicketLossInstant = cp.cp_getParam('enemyTicketLossWhenCaptured')
if enemyTicketLossInstant > 0 and newTeam > 0:

if newTeam == 1:
punishedTeam = 2
elif newTeam == 2:
punishedTeam = 1

tickets = bf2.gameLogic.getTickets(punishedTeam)
tickets -= enemyTicketLossInstant
bf2.gameLogic.setTickets(punishedTeam, tickets)

# update control point
cp.cp_setParam('playerId', playerId) #always set player first
if newTeam != -1 and cp.cp_getParam('team') != newTeam:
cp.cp_setParam('team', newTeam)
onCPTrigger(cp.triggerId, cp, 0, 0, 0)
updateTicketLoss()

def onPlayerDeathCQ(victim, vehicle):

# punish team with one ticket
if victim != None:
team = victim.getTeam()
teamTickets = bf2.gameLogic.getTickets(team)
teamTickets -= 1
bf2.gameLogic.setTickets(team, teamTickets)

# check if it was the last player
foundLivingPlayer = False
for p in bf2.playerManager.getPlayers():
if p != victim and p.getTeam() == victim.getTeam() and p.isAlive():
foundLivingPlayer = True

if not foundLivingPlayer:
if g_debug: print "Last player gone"
updateTicketLoss()

def onPlayerKilledCQ(victim, attacker, weapon, assists, object):
if not victim:
if g_debug: print "Killed event with no victim!"
return

victim.killed = True # Remove this flag to enabled players in "man down"-state to captuer flags

# update flag takeover status if victim was in a CP radius
cp = getOccupyingCP(victim)
if cp != None:
onCPTrigger(-1, cp, victim.getVehicle(), False, None)

# give defend score if killing enemy within cp radius
if attacker != None and attacker.getTeam() != victim.getTeam()\
and cp.cp_getParam('unableToChangeTeam') == 0 and cp.cp_getParam('onlyTakeableByTeam') == 0:

#if g_debug: print "CP found:", cp.templateName
if cp != None and cp.cp_getParam('team') == attacker.getTeam():
if g_debug: print "Player %d defended %s" % (attacker.index, cp.templateName)
attacker.score.cpDefends += 1
addScore(attacker, SCORE_DEFEND, RPL)
bf2.gameLogic.sendGameEvent(attacker, 12, 1) #12 = Conquest, 1 = Defend

def onPlayerRevived(victim, attacker):
# update flag takeover status if victim was in a CP radius

victim.killed = False

cp = getOccupyingCP(victim)
if cp != None:
onCPTrigger(-1, cp, victim.getVehicle(), True, None)

def onPlayerSpawn(player, soldier):
player.killed = False

def onEnterVehicle(player, vehicle, freeSoldier = False):
# update flag takeover status if player in a CP radius
cp = getOccupyingCP(player)
if cp != None:
player.setIsInsideCP(True)
else:
player.setIsInsideCP(False)

def onExitVehicle(player, vehicle):
# update flag takeover status if player in a CP radius
cp = getOccupyingCP(player)
if cp != None:
player.setIsInsideCP(True)
else:
player.setIsInsideCP(False)

# find cp that player is occupying, if any
def getOccupyingCP(player):
vehicle = player.getVehicle()
playerPos = vehicle.getPosition()

# find closest CP
closestCP = None
if len(g_controlPoints) == 0: return None
for obj in g_controlPoints:
distanceTo = getVectorDistance(playerPos, obj.getPosition())
if closestCP == None or distanceTo < closestCPdist:
closestCP = obj
closestCPdist = distanceTo

#if g_debug: print "Closest cp=", closestCP.templateName;

# is the player in radius?
pcos = bf2.triggerManager.getObjects(closestCP.triggerId)
for o in pcos:
if o == player.getDefaultVehicle():
# Player is DEFAULT vehicle - this is needed when called from onEnterVehicle
return closestCP
else:
for p in o.getOccupyingPlayers():
if p == player:
return closestCP

#if g_debug: print "Player not in radius"

return None

# get distance between two positions
def getVectorDistance(pos1, pos2):
diffVec = [0.0, 0.0, 0.0]
diffVec[0] = math.fabs(pos1[0] - pos2[0])
diffVec[1] = math.fabs(pos1[1] - pos2[1])
diffVec[2] = math.fabs(pos1[2] - pos2[2])

return math.sqrt(diffVec[0] * diffVec[0] + diffVec[1] * diffVec[1] + diffVec[2] * diffVec[2])

 
Форум » Игровой раздел » BattleField » Количество очков возраждения (BattleField 2)
  • Страница 1 из 1
  • 1
Поиск:

Group Storm © 2024