Könntest du bitte den rot markierten Teil noch rot markieren? Im Moment ist er nämlich im Moment alles schwarz.
Das löschen von "player.isAlive()" ist prinzipiell nicht so schlimm, meine ich.
Könntest du bitte den rot markierten Teil noch rot markieren? Im Moment ist er nämlich im Moment alles schwarz.
Das löschen von "player.isAlive()" ist prinzipiell nicht so schlimm, meine ich.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Hab's schnell rückgängig gemacht. Das hat aber nichts geändert.
Edit: Es ist nun rot. Und die Zeilen sind übrigens 349-385
Könnte ich genau so mein Problem lösen, dass die Civ am leben sein muss, dass etwas gespawnt wird?
das isAlive kann nicht die Ursache sein. Ob ein Spieler lebt oder nicht, d ie Codeklasse existiert trotzdem komplett. Es amcht nur keinen Sinn, eine Nachricht einen nicht lebenden Spieler zu schicken.
Außerdem, wenn isHuman crasht, sollte auch isAlive crashen.
Das sind übrigens keine 35 Fehler sondern die verteilte Ausgabe eines Fehlers
Warum sie es auf so viele Popups verteilen kann ich dir nicht sagen. Wahrscheinlich war das nie beabsichtigt.
Ich hatte darum gebeten, mit Zeile 350 zu zeigen, warum markierst du dann zwei Zeilen in deinem Code? Die Fehlermeldung verweist auf Zeile 350, die anderen Änderungen sind nicht schuld.
Gut, wenn das die Zeilen 349-385 sind, sit 350 wohl diese:
Weiter im Text: Da steht etwas von einem Identitation Error: expected an indented block. Das bedeutet meist, dass etwas mit dem Blocksatz nicht stimmt. Wenn der Blocksatz so ist wie hier abgebildet, stimme ich dem zu.Code:Code:def onLoadGame(self, argsList): CvAdvisorUtils.resetNoLiberateCities() ###spawnUnit 2 start### ####replace the "SpawnUnits" with the path of your mod. ####the folder name is meant. SpawnUnitUtil.init("SpawnUnits") ###spawnUnit part 2 end### return 0 def onGameStart(self, argsList): 'Called at the start of the game' ###spawnUnit part 3 start### ####replace the "SpawnUnits" with the path of your mod. ####the folder name is meant. SpawnUnitUtil.init("SpawnUnits") ###spawnUnit part 3 end### if (gc.getGame().getGameTurnYear() == gc.getDefineINT("START_YEAR") and not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)): for iPlayer in range(gc.getMAX_PLAYERS()): player = gc.getPlayer(iPlayer) if (player.isAlive() and player.isHuman()): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setText(u"showDawnOfMan") popupInfo.addPopup(iPlayer) else: CyInterface().setSoundSelectionReady(true) if gc.getGame().isPbem(): for iPlayer in range(gc.getMAX_PLAYERS()): player = gc.getPlayer(iPlayer) if (player.isAlive() and player.isHuman()): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_DETAILS) popupInfo.setOption1(true) popupInfo.addPopup(iPlayer) CvAdvisorUtils.resetNoLiberateCities()
Meiner Meinung nach muss CvAdvisorUtils.resetNoLiberateCities() auf der selben Höhe sein wie SpawnUnitUtil.init("Earth 35 Civs")
Und beides muss einen Tab weiter eingerückt sein als def onLoadGame(self, argsList):
Das muss auf der selben Höhe sein wie def onGameStart(self, argsList):
Überprüf das mal in deinem Mod, hier im zitierten Code sieht es nicht danach aus, aber das kann auch am zitieren liegen.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ich habe gedacht, die Änderung der Textzeile ohne etwas darüber zu wissen, habe einen grossen Einfluss auf das ganze. Ich dachte, das könnte schuld sein. Ich habe halt wirklich keine Ahnung von diesem System.
Ja das stimmt.Gut, wenn das die Zeilen 349-385 sind, sit 350 wohl diese:
[CODE][CODE]def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
Also, wenn ich dich richtig verstanden habe, dann ist das erste CvAdvisorUtils.resetNoLiberateCities() zu weit gegen rechts, ich habe es mit Tab nach hinten verschoben auf Höhe SpawnUnitUtil.init("Earth 35 Civs"). Auf der letzen Zeile ist CvAdvisorUtils.resetNoLiberateCities() auf der gleichen Höhe wie das obere.Weiter im Text: Da steht etwas von einem Identitation Error: expected an indented block. Das bedeutet meist, dass etwas mit dem Blocksatz nicht stimmt. Wenn der Blocksatz so ist wie hier abgebildet, stimme ich dem zu.
Meiner Meinung nach muss CvAdvisorUtils.resetNoLiberateCities() auf der selben Höhe sein wie SpawnUnitUtil.init("Earth 35 Civs")
Das ist es.Und beides muss einen Tab weiter eingerückt sein als def onLoadGame(self, argsList):
Das def onLoadGame(self, argsList) ist auf Höhe def onGameStart(self, argsList).Das muss auf der selben Höhe sein wie def onGameStart(self, argsList):
?
Nach Neuladen der Mod, zeigt es mir nun einen anderen Fehler an: Zeile 356: Syntax Error (rot markiert). Was bedeutet diese Zeile?
Ich habe hier die Ordnung ein bisschen angepasst, das Zitieren bringt wirklich alles ein bisschen durcheinander.
Hier hast du den Notepad Code als PHP-Code, ich denke, der zeigt es ziemlich adäquat.Code:def onLoadGame(self, argsList): CvAdvisorUtils.resetNoLiberateCities() ###spawnUnit 2 start### ####replace the "SpawnUnit" with the path of your mod. ####the folder name is meant. SpawnUnitUtil.init("Earth 35 Civs") ###spawnUnit part 2 end### return 0 def onGameStart(self, argsList): 'Called at the start of the game' ###spawnUnit part 3 start### ####replace the "SpawnUnit" with the path of your mod. ####the folder name is meant. SpawnUnitUtil.init("Earth 35 Civs") ###spawnUnit part 3 end### if (gc.getGame().getGameTurnYear() == gc.getDefineINT("START_YEAR") and not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)): for iPlayer in range(gc.getMAX_PLAYERS()): player = gc.getPlayer(iPlayer) if (player.isAlive() and player.isHuman()): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setText(u"showDawnOfMan") popupInfo.addPopup(iPlayer) else: CyInterface().setSoundSelectionReady(true) if gc.getGame().isPbem(): for iPlayer in range(gc.getMAX_PLAYERS()): player = gc.getPlayer(iPlayer) if (player.isAlive() and player.isHuman()): popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_DETAILS) popupInfo.setOption1(true) popupInfo.addPopup(iPlayer) CvAdvisorUtils.resetNoLiberateCities()
PHP-Code:
def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
###spawnUnit 2 start###
####replace the "SpawnUnit" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("Earth 35 Civs")
###spawnUnit part 2 end###
return 0
def onGameStart(self, argsList):
'Called at the start of the game'
###spawnUnit part 3 start###
####replace the "SpawnUnit" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("Earth 35 Civs")
###spawnUnit part 3 end###
if (gc.getGame().getGameTurnYear() == gc.getDefineINT("START_YEAR") and not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)):
for iPlayer in range(gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if (player.isAlive() and player.isHuman()):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN)
popupInfo.setText(u"showDawnOfMan")
popupInfo.addPopup(iPlayer)
else:
CyInterface().setSoundSelectionReady(true)
if gc.getGame().isPbem():
for iPlayer in range(gc.getMAX_PLAYERS()):
player = gc.getPlayer(iPlayer)
if (player.isAlive() and player.isHuman()):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_DETAILS)
popupInfo.setOption1(true)
popupInfo.addPopup(iPlayer)
CvAdvisorUtils.resetNoLiberateCities()
Geändert von Dolans (20. März 2015 um 09:22 Uhr)
Ich weiß nicht genau, was diese Zeile bedeutet. Sie ist aber genauso wie bei meinem Python-Code bei def onLoadGame.
Der "Syntax Error" kann sich unter Umständen auch auf die Zeile davor beziehen, wenn diese durch einen Fehler in der Syntax als nicht abgeschlossen gilt (Zeilen mit # haben dabei keine Wirkung, es müsste also wenn dann ein Fehler in dieser Zeilen sein: SpawnUnitUtil.init("Earth 35 Civs") ). In dieser Zeile sehe ich aber auch keinen offensichtlichen Syntax-Fehler.
Probleme erwarte ich zunächst in "SpawnUnitUtil.init("Earth 35 Civs") ", da ist der Block offenbar wieder verrutscht.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ich meinte eigentlich den Block unter " def onGameStart(self, argsList): ", aber vielleicht trifft das hier auch zu. Ich dachte allerdings, dass das für Zeilen mit ### nicht gelten würde. Wenn es allerdings gilt, muss das natürlich auch hier angepasst werden.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ich habe da ein bisschen herumprobiert und habe herausgefunden, mit welcher Kombination es zwar keine Fehlermeldungen mehr gibt, die Einheiten aber doch noch nicht spawnen.
Dazu der originale Codeteil von The_J.PHP-Code:
def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
###spawnUnit part 2 start###
####replace the "SpawnUnit" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("Earth 35 Civs")
###spawnUnit part 2 end###
return 0
def onGameStart(self, argsList):
'Called at the start of the game'
###spawnUnit part 3 start###
####replace the "SpawnUnit" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("Earth 35 Civs")
###spawnUnit part 3 end###
Bei The_Js Code fehlt das Wort part im ersten Abschnitt bei SpawnUnit part 2. Das ist aber mit den Nummerzeichen versehen, bei denen es anscheinend wirklich keinen Unterschied macht, an welcher Stelle die Codezeile beginnt und was genau darin steht. Hingegen musste ich die beiden SpawnUnitUtil.init nach vorne verschieben. So erhalte ich wie gesagt, keine Fehlermeldungen mehr.PHP-Code:
def onLoadGame(self, argsList):
CvAdvisorUtils.resetNoLiberateCities()
###spawnUnit 2 start###
####replace the "SpawnUnits" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("SpawnUnits")
###spawnUnit part 2 end###
return 0
def onGameStart(self, argsList):
'Called at the start of the game'
###spawnUnit part 3 start###
####replace the "SpawnUnits" with the path of your mod.
####the folder name is meant.
SpawnUnitUtil.init("SpawnUnits")
###spawnUnit part 3 end###
Das ist korrekt, SpawnUnitUtil.init("Earth 35 Civs") muss auf einer Höhe mit CvAdvisorUtils.resetNoLiberateCities() bzw. 'Called at the start of the game' liegen.
Wenn immer noch nichts spawnt, wäre eine mögliche Fehlerquelle, dass der Modname "Earth 35 Civs" nicht korrekt ist. Stimmen alle Leerzeichen?
Setz vorsichtshalber auch einmal alle mit ### beginnenden Zeilen auf die selbe Höhe wie den Rest. Vielleicht hat sich auch die Civ4.ini resettet, das macht die schon einmal ohne nachvollziehbaren Grund. Prüf mal, ob die immer noch auf "Hide Python Exceptions" = 0 steht.
Wenn jetzt nichts spawnt, vermute ich, dass irgend etwas mit der SpawnUnits.py nicht stimmt. Aber ich habe noch keine Idee, was.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ist korrekt laut Earth 35 Civs.iniWenn immer noch nichts spawnt, wäre eine mögliche Fehlerquelle, dass der Modname "Earth 35 Civs" nicht korrekt ist.
PHP-Code:
; Name of Mod
Name = Earth 35 Civs
Gemacht, hat nichts gebracht.Setz vorsichtshalber auch einmal alle mit ### beginnenden Zeilen auf die selbe Höhe wie den Rest.
Überprüft. Steht immer noch auf 0. Beim Laden der Mod, hat das Spiel lange beim Init XML (uncached), dort wo es vorher auch die Fehler gefunden hat.Vielleicht hat sich auch die Civ4.ini resettet, das macht die schon einmal ohne nachvollziehbaren Grund. Prüf mal, ob die immer noch auf "Hide Python Exceptions" = 0 steht.
Hier habe ich dir mal die SpawnUnit Util.py-Datei:
PHP-Code:
##SpawnUnitUtil
###MODDER READ THIS:
###You do not have to change anything in this file.
###all changes have to be done in the CvEventManager.
###This file has to be in the same folder like the CvEventManager.py.
from CvPythonExtensions import *
import gc as garbage
gc = CyGlobalContext()
SpawnUnitList = []
def process(iTurn):
for entry in SpawnUnitList:
if entry.iTurn == iTurn:
AddUnits(entry)
def AddUnits(entry):
iMaxCiv = gc.getMAX_CIV_PLAYERS ()
for i in range(iMaxCiv):
pPlayer = gc.getPlayer(i)
iCiv = pPlayer.getCivilizationType()
if iCiv == entry.iCiv:
break
else:
return
if not pPlayer.isAlive():
return
if (entry.iX <=-1) or (entry.iY<=-1):
if pPlayer.isBarbarian():
return False
entry.iX = pPlayer.getCapitalCity().getX()
entry.iY = pPlayer.getCapitalCity().getY()
bPlotValid = checkPlot(entry,pPlayer,CyMap().plot(entry.iX,entry.iY))
if not bPlotValid:
for iXLoop in range(entry.iX - 1, entry.iX + 2, 1):
for iYLoop in range(entry.iY - 1, entry.iY + 2, 1):
pPlot = CyMap().plot(iXLoop,iYLoop)
bPlotValid = checkPlot(entry,pPlayer,pPlot)
if bPlotValid:
entry.iX = iXLoop
entry.iY = iYLoop
break
if bPlotValid:
break
if not bPlotValid:
if pPlayer.isBarbarian():
return
entry.iX = pPlayer.getCapitalCity().getX()
entry.iY = pPlayer.getCapitalCity().getY()
cvUnit = gc.getUnitInfo(entry.iUnit)
iUnitDomain = cvUnit.getDomainType ()
if iUnitDomain ==gc.getInfoTypeForString("DOMAIN_SEA"):
if not CyMap().plot(entry.iX,entry.iY).isCoastalLand ():
(loopCity, iter) = pPlayer.firstCity(false)
while(loopCity):
if CyMap().plot(loopCity.getX(),loopCity.getY()).isCoastalLand ():
entry.iX = loopCity.getX()
entry.iY = loopCity.getY()
break
(loopCity, iter) = pPlayer.nextCity(iter, false)
if not CyMap().plot(entry.iX,entry.iY).isCoastalLand ():
return False
for i in range(entry.iNumUnit):
pUnit = pPlayer.initUnit(entry.iUnit, entry.iX,entry.iY, UnitAITypes.NO_UNITAI, DirectionTypes.NO_DIRECTION )
for iProm in entry.lPromotion:
pUnit.setHasPromotion(iProm,True)
CyInterface().addMessage(pPlayer.getID(),False,15,CyTranslator().getText("TXT_KEY_REINFORCEMENT",()),'',0,gc.getUnitInfo(entry.iUnit).getButton(),gc.getInfoTypeForString("COLOR_GREEN") , entry.iX,entry.iY, True,True)
garbage.collect()
def checkPlot(entry,pPlayer,pPlot):
cvUnit = gc.getUnitInfo(entry.iUnit)
iUnitDomain = cvUnit.getDomainType ()
if pPlot.isWater() and (iUnitDomain !=gc.getInfoTypeForString("DOMAIN_SEA")):
return False
if (not pPlot.isWater()) and (iUnitDomain ==gc.getInfoTypeForString("DOMAIN_SEA")):
return False
if (iUnitDomain ==gc.getInfoTypeForString("DOMAIN_AIR") and not pPlot.isCity()):
return False
if pPlot.isImpassable ():
return False
if pPlayer.isBarbarian():
if pPlot.getOwner()>-1 and (pPlayer.getID()!=pPlot.getOwner()):
pOtherPlayer = gc.getPlayer(pPlot.getOwner())
for i in range(gc.getNumBuildingInfos ()):
cvBuilding = gc.getBuildingInfo(i)
if cvBuilding.isAreaBorderObstacle ():
if pOtherPlayer.countNumBuildings(i)>0:
return False
pTeam = gc.getTeam(pPlayer.getTeam())
if (pPlot.getOwner()<=-1) or (pPlot.getOwner()==pPlayer.getID()):
if pPlot.getNumUnits ()<=0:
return True
else:
for i in range(pPlot.getNumUnits ()):
pUnit = pPlot.getUnit(i)
if pTeam.isAtWar(pUnit.getTeam()):
return False
if pPlot.getOwner()>-1:
if pPlayer.getID()!=pPlot.getOwner():
pOtherPlayer = gc.getPlayer(pPlot.getOwner())
pOtherTeam = gc.getTeam(pOtherPlayer.getTeam())
if pTeam.getID()!=pOtherTeam.getID():
if pTeam.isOpenBorders(pOtherTeam.getID()):
return True
elif pTeam.isAtWar(pOtherTeam.getID()):
if pPlot.isCity():
return False
else:
return True
elif pOtherTeam.isVassal(pTeam.getID()):
return True
elif not pTeam.isOpenBorders(pOtherTeam.getID()):
return False
return True
def init(sModName):
MyFile = open("Mods/"+sModName+"/Assets/XML/CustomXML/CIV4SpawnUnitInfos.xml")
del SpawnUnitList[:]
for CurString in MyFile.readlines():
if "UnitType" in CurString:
CurEntry = SpawnEntry()
CurEntry.iUnit = gc.getInfoTypeForString(CutString(CurString))
if ("Promotion" in CurString) and not ("Promotions" in CurString):
CurEntry.lPromotion.append(gc.getInfoTypeForString(CutString(CurString)))
if "iNumUnit" in CurString:
CurEntry.iNumUnit = int(CutString(CurString))
elif "CIVILIZATION" in CurString:
CurEntry.iCiv = gc.getInfoTypeForString(CutString(CurString))
elif "Scenario>" in CurString:
CurEntry.sScenario = str(CutString(CurString)).upper()
elif "iTurn" in CurString:
CurEntry.iTurn = int(CutString(CurString))
elif "StartX" in CurString:
CurEntry.iX = int(CutString(CurString))
elif "StartY" in CurString:
CurEntry.iY = int(CutString(CurString))
SpawnUnitList.append(CurEntry)
MyFile.close()
MapName = CyMap().getMapScriptName ()
bScenario = False
if (".CIV" in MapName.upper()) and (not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)):
bScenario = True
if "civbeyondswordwbsave".upper() in MapName.upper():
MapName = MapName[0:-21]
if "CivWarlordsWBSave".upper() in MapName.upper():
MapName = MapName[0:-18]
if "Civ4WorldBuilderSave".upper() in MapName.upper():
MapName = MapName[0:-21]
MapName = MapName.upper()
lPop = []
del lPop[:]
if bScenario:
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].sScenario!=MapName:
if i not in lPop:
lPop.append(i)
if not bScenario:
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].sScenario!="-1":
if i not in lPop:
lPop.append(i)
iMaxCiv = gc.getMAX_CIV_PLAYERS ()
lCivs = []
del lCivs[:]
for i in range(iMaxCiv):
pPlayer = gc.getPlayer(i)
lCivs.append(pPlayer.getCivilizationType())
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].iCiv not in lCivs:
if i not in lPop:
lPop.append(i)
if SpawnUnitList[i].iTurn<=(CyGame().getGameTurn ()-2):
if i not in lPop:
lPop.append(i)
if SpawnUnitList[i].iCiv==-1:
if i not in lPop:
lPop.append(i)
lPop.sort()
lPop.reverse()
iPop = len(lPop)
for i in range(iPop):
SpawnUnitList.pop(lPop[i])
garbage.collect()
def CutString(string):
string = str(string)
string = string.strip()
string = string[2:-1]
BeginPos=-1
EndPos = -1
for i in xrange(len(string)):
if string[i]==">":
BeginPos=i
elif string[i]=="<":
EndPos=i
break
else:
return "-1"
NewString = string[BeginPos+1:EndPos]
return str(NewString)
class SpawnEntry:
def __init__(self):
self.iUnit = ""
self.iCiv = 0
self.lPromotion = []
self.sScenario = ""
self.iNumUnit = -1
self.iTurn = 0
self.iX = -1
self.iY = -1
Ich nehme an, daran hast du dich gehalten: You do not have to change anything in this file
Und hierdran: ###This file has to be in the same folder like the CvEventManager.py.
Ich vertraue The_J, dass er das dann sauber programmiert hat, von ihm habe ich viel über Python gelernt, und was er mir zwischendruch programmiert hat, hat immer funktioniert.
Dann bleibt nur noch, einen Blick auf ###spawnUnit part 1 start### (in CvEventmanager) zu werden. Und eventuell, falls es das geben sollte, auf ###spawnUnit part 4 start###, ###spawnUnit part n start### (für n > 4).
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys