浏览代码

Town portal fix

nordsoft 2 年之前
父节点
当前提交
fc310c6e79
共有 1 个文件被更改,包括 32 次插入17 次删除
  1. 32 17
      lib/spells/AdventureSpellMechanics.cpp

+ 32 - 17
lib/spells/AdventureSpellMechanics.cpp

@@ -360,6 +360,12 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 {
 	const CGTownInstance * destination = nullptr;
 	const int moveCost = movementCost(parameters);
+	
+	if(!parameters.caster->getHeroCaster())
+	{
+		env->complain("Not a hero caster!");
+		return ESpellCastResult::ERROR;
+	}
 
 	if(parameters.caster->getSpellSchoolLevel(owner) < 2)
 	{
@@ -369,13 +375,13 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 		if(nullptr == destination)
 			return ESpellCastResult::ERROR;
 
-		if(static_cast<int>(parameters.caster->movement) < moveCost)
+		if(static_cast<int>(parameters.caster->getHeroCaster()->movement) < moveCost)
 			return ESpellCastResult::ERROR;
 
 		if(destination->visitingHero)
 		{
 			InfoWindow iw;
-			iw.player = parameters.caster->tempOwner;
+			iw.player = parameters.caster->getCasterOwner();
 			iw.text.addTxt(MetaString::GENERAL_TXT, 123);
 			env->apply(&iw);
 			return ESpellCastResult::CANCEL;
@@ -411,7 +417,7 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 			return ESpellCastResult::ERROR;
 		}
 
-		const auto relations = env->getCb()->getPlayerRelations(destination->tempOwner, parameters.caster->tempOwner);
+		const auto relations = env->getCb()->getPlayerRelations(destination->tempOwner, parameters.caster->getCasterOwner());
 
 		if(relations == PlayerRelations::ENEMIES)
 		{
@@ -419,7 +425,7 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 			return ESpellCastResult::ERROR;
 		}
 
-		if(static_cast<int>(parameters.caster->movement) < moveCost)
+		if(static_cast<int>(parameters.caster->getHeroCaster()->movement) < moveCost)
 		{
 			env->complain("This hero has not enough movement points!");
 			return ESpellCastResult::ERROR;
@@ -437,11 +443,11 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 		return ESpellCastResult::ERROR;
 	}
 
-	if(env->moveHero(parameters.caster->id, parameters.caster->convertFromVisitablePos(destination->visitablePos()), true))
+	if(env->moveHero(ObjectInstanceID(parameters.caster->getCasterUnitId()), parameters.caster->getHeroCaster()->convertFromVisitablePos(destination->visitablePos()), true))
 	{
 		SetMovePoints smp;
-		smp.hid = parameters.caster->id;
-		smp.val = std::max<ui32>(0, parameters.caster->movement - moveCost);
+		smp.hid = ObjectInstanceID(parameters.caster->getCasterUnitId());
+		smp.val = std::max<ui32>(0, parameters.caster->getHeroCaster()->movement - moveCost);
 		env->apply(&smp);
 	}
 	return ESpellCastResult::OK;
@@ -450,11 +456,17 @@ ESpellCastResult TownPortalMechanics::applyAdventureEffects(SpellCastEnvironment
 ESpellCastResult TownPortalMechanics::beginCast(SpellCastEnvironment * env, const AdventureSpellCastParameters & parameters) const
 {
 	std::vector<const CGTownInstance *>	towns = getPossibleTowns(env, parameters);
+	
+	if(!parameters.caster->getHeroCaster())
+	{
+		env->complain("Not a hero caster!");
+		return ESpellCastResult::ERROR;
+	}
 
 	if(towns.empty())
 	{
 		InfoWindow iw;
-		iw.player = parameters.caster->tempOwner;
+		iw.player = parameters.caster->getCasterOwner();
 		iw.text.addTxt(MetaString::GENERAL_TXT, 124);
 		env->apply(&iw);
 		return ESpellCastResult::CANCEL;
@@ -462,10 +474,10 @@ ESpellCastResult TownPortalMechanics::beginCast(SpellCastEnvironment * env, cons
 
 	const int moveCost = movementCost(parameters);
 
-	if(static_cast<int>(parameters.caster->movement) < moveCost)
+	if(static_cast<int>(parameters.caster->getHeroCaster()->movement) < moveCost)
 	{
 		InfoWindow iw;
-		iw.player = parameters.caster->tempOwner;
+		iw.player = parameters.caster->getCasterOwner();
 		iw.text.addTxt(MetaString::GENERAL_TXT, 125);
 		env->apply(&iw);
 		return ESpellCastResult::CANCEL;
@@ -510,13 +522,13 @@ ESpellCastResult TownPortalMechanics::beginCast(SpellCastEnvironment * env, cons
 		if(request.objects.empty())
 		{
 			InfoWindow iw;
-			iw.player = parameters.caster->tempOwner;
+			iw.player = parameters.caster->getCasterOwner();
 			iw.text.addTxt(MetaString::GENERAL_TXT, 124);
 			env->apply(&iw);
 			return ESpellCastResult::CANCEL;
 		}
 
-		request.player = parameters.caster->getOwner();
+		request.player = parameters.caster->getCasterOwner();
 		request.title.addTxt(MetaString::JK_TXT, 40);
 		request.description.addTxt(MetaString::JK_TXT, 41);
 		request.icon.id = Component::EComponentType::SPELL;
@@ -534,13 +546,16 @@ const CGTownInstance * TownPortalMechanics::findNearestTown(SpellCastEnvironment
 {
 	if(pool.empty())
 		return nullptr;
+	
+	if(!parameters.caster->getHeroCaster())
+		return nullptr;
 
 	auto nearest = pool.cbegin(); //nearest town's iterator
-	si32 dist = (*nearest)->pos.dist2dSQ(parameters.caster->pos);
+	si32 dist = (*nearest)->pos.dist2dSQ(parameters.caster->getHeroCaster()->pos);
 
 	for(auto i = nearest + 1; i != pool.cend(); ++i)
 	{
-		si32 curDist = (*i)->pos.dist2dSQ(parameters.caster->pos);
+		si32 curDist = (*i)->pos.dist2dSQ(parameters.caster->getHeroCaster()->pos);
 
 		if(curDist < dist)
 		{
@@ -555,7 +570,7 @@ std::vector <const CGTownInstance*> TownPortalMechanics::getPossibleTowns(SpellC
 {
 	std::vector <const CGTownInstance*> ret;
 
-	const TeamState * team = env->getCb()->getPlayerTeam(parameters.caster->getOwner());
+	const TeamState * team = env->getCb()->getPlayerTeam(parameters.caster->getCasterOwner());
 
 	for(const auto & color : team->players)
 	{
@@ -582,11 +597,11 @@ ESpellCastResult ViewMechanics::applyAdventureEffects(SpellCastEnvironment * env
 {
 	ShowWorldViewEx pack;
 
-	pack.player = parameters.caster->getOwner();
+	pack.player = parameters.caster->getCasterOwner();
 
 	const auto spellLevel = parameters.caster->getSpellSchoolLevel(owner);
 
-	const auto fowMap = env->getCb()->getPlayerTeam(parameters.caster->getOwner())->fogOfWarMap;
+	const auto fowMap = env->getCb()->getPlayerTeam(parameters.caster->getCasterOwner())->fogOfWarMap;
 
 	for(const CGObjectInstance * obj : env->getMap()->objects)
 	{