Hooks
static bool BeforeCvUnit_paradrop(CvUnit* self, int iX, int iY, bool& result);static void AfterCvUnit_paradrop(CvUnit* self, int iX, int iY, bool& result);static bool ReplaceCvUnit_paradrop(bool (*original)(CvUnit*, int, int), CvUnit* self, int iX, int iY);CivRegisterBefore<CivHooks::CvUnit_paradrop>(host, &BeforeCvUnit_paradrop);CivRegisterAfter<CivHooks::CvUnit_paradrop>(host, &AfterCvUnit_paradrop);CivRegisterReplace<CivHooks::CvUnit_paradrop>(host, &ReplaceCvUnit_paradrop);
Code
6642bool CvUnit::paradrop(int iX, int iY)6643{6644 VALIDATE_OBJECT6645 if(!canParadropAt(plot(), iX, iY))6646 {6647 return false;6648 }66496650 CvPlot* pPlot = GC.getMap().plot(iX, iY);6651 if(! pPlot)6652 {6653 return false;6654 }66556656#if defined(MOD_GLOBAL_PARATROOPS_MOVEMENT)6657 // If dropping less than max range, let the unit make an attack6658 int iRange = getDropRange();6659 int iDist = plotDistance(plot()->getX(), plot()->getY(), iX, iY);6660 bool bCanAttack = MOD_GLOBAL_PARATROOPS_MOVEMENT && (iDist < iRange);6661 if (bCanAttack) {6662 // CUSTOMLOG("Paradrop - %i of %i is less than range --> can attack", iDist, iRange);6663 changeMoves(-GC.getMOVE_DENOMINATOR()); // This equates to a "set-up to range attack", which seems fair6664 // setMadeAttack(false); // Don't set to false, just in case someone modded in "attack then paralift out"6665 } else {6666 // CUSTOMLOG("Paradrop - %i of %i is max range --> cannot attack", iDist, iRange);6667#endif6668 changeMoves(-(GC.getMOVE_DENOMINATOR() / 2));6669 setMadeAttack(true);6670#if defined(MOD_GLOBAL_PARATROOPS_MOVEMENT)6671 }6672#endif667366746675 CvPlot* fromPlot = plot();6676 //JON: CHECK FOR INTERCEPTION HERE6677#if defined(MOD_GLOBAL_PARATROOPS_AA_DAMAGE)6678 if (MOD_GLOBAL_PARATROOPS_AA_DAMAGE) {6679 if (CvUnitCombat::ParadropIntercept(*this, *pPlot)) {6680 // Unit died during the drop6681 return false;6682 }6683 }6684#endif66856686 //play paradrop animation6687 if(pPlot->isActiveVisible(false))6688 {6689 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(this));6690 gDLL->GameplayUnitParadrop(pDllUnit.get());6691 }6692 setXY(pPlot->getX(), pPlot->getY(), true, true, false);66936694#if defined(MOD_EVENTS_PARADROPS)6695 if (MOD_EVENTS_PARADROPS) {6696 GAMEEVENTINVOKE_HOOK(GAMEEVENT_ParadropAt, getOwner(), GetID(), fromPlot->getX(), fromPlot->getY(), pPlot->getX(), pPlot->getY());6697 } else {6698#endif6699 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();6700 if (pkScriptSystem)6701 {6702 CvLuaArgsHandle args;6703 args->Push(((int)getOwner()));6704 args->Push(GetID());6705 args->Push(fromPlot->getX());6706 args->Push(fromPlot->getY());6707 args->Push(pPlot->getX());6708 args->Push(pPlot->getY());67096710 bool bResult;6711 LuaSupport::CallHook(pkScriptSystem, "ParadropAt", args.get(), bResult);6712 }6713#if defined(MOD_EVENTS_PARADROPS)6714 }6715#endif67166717 return true;6718}