script GRAPPLE_GETUNUSEDTID (int mode, int fromItem) { int newTID = TIDSTART; switch (mode) { case 0: while (ThingCount(0, newTID) > 0) { newTID++; } if (fromItem) { GiveInventory("ItemGrappleTID", newTID); } else { GiveInventory("GrappleTIDIndicator", newTID); } Thing_ChangeTID(0, newTID); break; case 1: if (fromItem) { SetResultValue(CheckInventory("ItemGrappleTID")); } else { SetResultValue(CheckInventory("GrappleTIDIndicator")); } break; case 2: while (ThingCount(0, newTID) > 0) { newTID++; } if (fromItem) { GiveInventory("ItemGrappleTID", newTID); } else { GiveInventory("GrappleTIDIndicator", newTID); } Thing_ChangeTID(0, newTID); SetResultValue(newTID); break; } }
void CheckCombo() { // Time Freeze special handling if (Player.Combo > 0 && (CheckInventory("PowerTimeFreezer") || CheckInventory("DRPGPowerStimChrono")) && Player.ComboTimer >= COMBO_MAX) Player.ComboTimer = COMBO_MAX - 1; // Subtract the combo timer each tic if ((Player.Combo > 0 || Player.ComboTimer < COMBO_MAX) && !CheckInventory("PowerTimeFreezer") && !CheckInventory("DRPGPowerStimChrono")) Player.ComboTimer--; // Reset values if you start the combo again while it was cooling down if (Player.ComboTimer == COMBO_MAX) { Player.BonusGained = 0; Player.XPGained = 0; Player.RankGained = 0; } // Add up and randomize the XP and Rank gain if (Player.ComboTimer == COMBO_STOP || (Player.Aura.Type[AURA_WHITE].Active && Player.Aura.Type[AURA_WHITE].Level >= 2 && Timer() == 4)) { long int ComboBonus = ((Player.XPGained + Player.RankGained) / 100 * Player.Combo); // You cannot gain Negative XP, but you can lose Rank if (Player.XPGained < 0) Player.XPGained = 0; if (Player.Combo > 1) { Player.BonusGained += ComboBonus; Player.XP += Player.XPGained + ComboBonus; Player.Rank += Player.RankGained + ComboBonus; } else { Player.XP += Player.XPGained; Player.Rank += Player.RankGained; } Player.XPGained = 0; Player.RankGained = 0; } if (Player.ComboTimer < 0) { Player.Combo = 0; Player.ComboTimer = COMBO_MAX; Player.BonusGained = 0; Player.XPGained = 0; Player.RankGained = 0; } }
script GRAPPLE_REEL (int grappleTid, int strength, int firetype) { int nX; int nY; int nZ; int plX; int plY; int plZ; int vX; int vY; int vZ; int velX; int velY; int velZ; int breakLoop = false; int magnitude; int pln = PlayerNumber(); int playerTid = ActivatorTID(); if (playerTid == 0) // can we give him a TID without breaking anything? { playerTid = unusedTID(TIDSTART, -1); Thing_ChangeTID(0, playerTid); } // if not, then okay, just use the one he has already int grX = GetActorX(grappleTid); int grY = GetActorY(grappleTid); int grZ = GetActorZ(grappleTid); while (!breakLoop) { if (ThingCount(0, grappleTID) != 1) { break; } plX = GetActorX(0); plY = GetActorY(0); plZ = GetActorZ(0); vX = grX - plX; vY = grY - plY; vZ = grZ - plZ; // NOTE: I had to drop precision here in exchange for not overflowing magnitude = magnitudeThree(vX >> 16, vY >> 16, vZ >> 16); if (magnitude != 0) { nX = vX / magnitude; nY = vY / magnitude; nZ = vZ / magnitude; ACS_ExecuteAlways(GRAPPLE_DRAWLINE, 0, grappleTid, playerTid, 16); } else { nX = 0; nY = 0; nZ = 0; } SetActorVelocity(0, nX*strength, nY*strength, nZ*strength, true, true); if (CheckInventory("Grappling") == 0) { breakLoop = true; } Delay(1); } Thing_Remove(grappleTid); }
function int SplinterCount(void) { int i, ret; for (i = 0; i < 5; i++) { if (CheckInventory(Splinters[i])) { ret += 1; } } return ret; }
void ShopItemTryAutoDeposit(ItemInfoPtr Item) { bool deposited = false; // Special handling for DRLA weapons since you can only keep one weapon with mods in the locker if (CompatMode == COMPAT_DRLA && Item->Category == 0 && Player.Locker[Item->Category][Item->Index] > 0) return; while (CheckInventory(Item->Actor) > 0 && (Player.EP >= LOCKER_EPRATE || CurrentLevel->UACBase)) { DepositItem(Item->Category, Item->Index, false, true); deposited = true; } if (deposited) ActivatorSound("shop/autostore", 127); }
void CGameStateRecorder::OnGameplayEvent(IEntity *pEntity, const GameplayEvent &event) { EntityId id; if(!pEntity || !(id = pEntity->GetId())) { GameWarning("TimeDemo:GameState::OnGamePlayEvent: Entity not found"); return; } CActor *pActor = (CActor*)(gEnv->pGame->GetIGameFramework()->GetIActorSystem()->GetActor(id)); if(!pActor) { GameWarning("TimeDemo:GameState::OnGamePlayEvent: Entity %s has no actor", pEntity->GetName()); return; } GameplayEvent event2 = event; event2.extra = 0;// event2 is the forwarded event, extra either will be not used by the listener or re-set as a string uint8 eType = event.event; bool bPlayer = (pActor->IsPlayer() && m_mode); if(bPlayer || m_mode==GPM_AllActors) { //items switch(eType) { case eGE_ItemPickedUp: { CheckInventory(pActor,0);//,*m_pRecordGameEventFtor); } break; case eGE_ItemDropped: { TItemName itemName = GetItemName(EntityId(event.extra)); if(!itemName ) //if(itemIdx < 0) break; event2.description = itemName; SendGamePlayEvent(pEntity,event2); IEntity* pItemEntity = gEnv->pEntitySystem->FindEntityByName(itemName); if(!pItemEntity) break; IItem* pItem = g_pGame->GetIGameFramework()->GetIItemSystem()->GetItem(pItemEntity->GetId()); if(!pItem) break; IEntityClass* pItemClass = pItem->GetEntity()->GetClass(); if(pItemClass && !strcmpi(pItemClass->GetName(),"SOCOM")) { IItem* pCurrentItem = pActor->GetCurrentItem(); if(pCurrentItem) { IEntityClass* pCurrentItemClass = pCurrentItem->GetEntity()->GetClass(); if(pCurrentItemClass && !strcmpi(pCurrentItemClass->GetName(),"SOCOM")) { GameplayEvent event3; event3.event = eGE_ItemSelected; TItemName itemName = GetItemName(pCurrentItem->GetEntity()->GetId()); if(!itemName) break; event3.value = 0; event3.description = (const char*)itemName; SendGamePlayEvent(pEntity,event3); } } } } break; case eGE_WeaponFireModeChanged: { TItemName itemIdx = GetItemName(EntityId(event.extra)); if(!itemIdx)//if(itemIdx < 0) break; event2.description = (const char*)itemIdx; SendGamePlayEvent(pEntity,event2); } break; case eGE_ItemSelected: { EntityId itemId = EntityId(event.extra); TItemName itemIdx = GetItemName(itemId); if(itemId && !itemIdx) break; event2.value = 0; event2.description = (const char*)itemIdx; SendGamePlayEvent(pEntity,event2); } break; case eGE_AttachedAccessory: { if(!IsGrenade(event.description)) // NOT OffHandGrenade SendGamePlayEvent(pEntity,event2); } break; case eGE_AmmoCount: { const char* itemIdx = event.description; if(!itemIdx) break; TGameStates::iterator itGS; /*if(pActor->IsPlayer()) itGS = m_itSingleActorGameState; else */if(pActor->GetEntity()) itGS = m_GameStates.find(pActor->GetEntity()->GetId()); else break; if(itGS == m_GameStates.end()) break; SActorGameState& gstate = itGS->second; IEntity* pItemEntity = gEnv->pEntitySystem->FindEntityByName(itemIdx); if(!pItemEntity) break; IItem* pItem = g_pGame->GetIGameFramework()->GetIItemSystem()->GetItem(pItemEntity->GetId()); if(!pItem) break; CWeapon* pWeapon = (CWeapon*)(pItem->GetIWeapon()); if(pWeapon && pWeapon->GetEntity()) { TItemContainer::iterator it = gstate.Items.find(itemIdx); if(it==gstate.Items.end()) break; SItemProperties& recItem = it->second; SWeaponAmmo weaponAmmo = pWeapon->GetFirstAmmo(); bool bGrenade = false; if(!weaponAmmo.pAmmoClass) { // special case for grenades if(IsAmmoGrenade((const char*)(event.extra))) { weaponAmmo.pAmmoClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass((const char*)event.extra); weaponAmmo.count = (int)event.value; bGrenade = true; } } for(; weaponAmmo.pAmmoClass ; weaponAmmo = pWeapon->GetNextAmmo()) { int ammoCount = weaponAmmo.count; const char* ammoClass; if(weaponAmmo.pAmmoClass && (ammoClass = weaponAmmo.pAmmoClass->GetName())) { TAmmoContainer& recAmmo = bGrenade? gstate.AmmoMags : recItem.Ammo; if(recAmmo.find(ammoClass) == recAmmo.end()) recAmmo.insert(std::make_pair(ammoClass,0)); if(ammoCount != recAmmo[ammoClass]) { event2.event = eGE_AmmoCount; event2.value = (float)ammoCount; if(event2.value < 0) event2.value = 0; event2.extra = (void*)ammoClass; event2.description = (const char*)itemIdx; SendGamePlayEvent(pEntity,event2); } } } } } break; case eGE_EntityGrabbed: { EntityId entityId = EntityId(event.extra); IEntity * pGrabbedEntity = gEnv->pEntitySystem->GetEntity(entityId); if(pGrabbedEntity) { event2.description = pGrabbedEntity->GetName(); SendGamePlayEvent(pEntity,event2); } } break; case eGE_WeaponReload: case eGE_ZoomedIn: case eGE_ZoomedOut: case eGE_HealthChanged: case eGE_ItemExchanged: SendGamePlayEvent(pEntity,event2); break; default: break; } } }
script SAMSARA_DECORATE (int choice, int arg1, int arg2) { int clipcount; int result; int i, j, k; int x, y, z; int armorIndex, armorToSet; int pln = PlayerNumber(); switch (choice) { case 1: result = GetActorProperty(0, APROP_Dropped); break; case 2: if (CheckInventory("WolfenMovement") == 1) { SetActorState(0, "Spawn"); } break; case 3: result = !(GetCVar("sv_itemrespawn") || GetCVar("sv_weaponstay")); break; case 4: result = isInvasion() || !(isCoop() || isSinglePlayer()); break; case 5: SetActivatorToTarget(0); result = CheckInventory("Cell"); if (arg1) { TakeInventory("Cell", result); } break; case 6: result = GetCVar("skulltag"); break; case 7: if (arg2 != 1) { GiveQuad(arg1); } else { if (isLMS()) { if (GetCvar("samsara_permaquad") == 1) { GiveInventory("QuadDamageItem", 1); } break; } GiveQuad(arg1); if (GetCvar("samsara_permaquad") == 1)//if (isCoop() || isSinglePlayer()) { GiveInventory("QuadDamageItem", 1); } } break; case 8: result = defaultCVar("samsara_cl_expparticles", 0); if (!result) { result = 100; } result = max(0, result); result *= max(arg1, 1); result /= max(arg2, 1); GiveInventory("QuakeExplosionCounter", result); break; case 9: clipcount = CheckInventory("Clip"); if (clipcount < 50) { GiveInventory("Clip", 50 - clipcount); TakeInventory("Clip", CheckInventory("Clip") - 50); result = 1; } break; case 10: TakeInventory("QuakeExplosionCounter", arg1); result = CheckInventory("QuakeExplosionCounter"); break; case 15: SetActorProperty(0, APROP_Speed, percFloat(arg1, arg2)); break; case 16: if (GameType () != GAME_SINGLE_PLAYER) { SetHudSize(400, 300, 0); Hudmessage(s:"Press any button to respawn."; HUDMSG_PLAIN,1,CR_LIGHTBLUE,200.4,9.1,1.75); delay(15); if (!CheckInventory("DukeBallgag")) { LocalAmbientSound("duke/mpdeath",127); GiveInventory("DukeTauntCooldown",5); ACS_ExecuteAlways(205,0,0); } } break; case 17: if (arg1) { result = GetCVar("samsara_permault"); } else { result = GetCVar("sv_weaponstay"); } break; case 18: if (MapArmors[0] == -1) { CheckMapArmors(); } SetArmorMode(); i = Timer() != 0; if (MapArmors[ARMOR_YELLOW] == 1) { i += 2; } SetActorState(0, ArmorModeStates[ArmorMode][i]); break; case 19: result = isLMS(); break; case 20: SetArmorMode(); armorIndex = -1; armorToSet = arg1; for (i = 0; i < ARMORCOUNT; i++) { if (GetArmorType(ArmorItems[ArmorMode][i][0], pln)) { armorIndex = i; break; } } arg1 = middle(0, arg1, ARMORCOUNT-1); i = CheckInventory("Armor"); j = ArmorItems[ArmorMode][arg1][1]; if (j == 0) { result = 0; break; } /* If we're adding armor, always follow through Else, if the ending armor count is lower than the current armor count and we're not upgrading our armor, give up now */ if (arg2 > 0) { if (arg1 <= armorIndex) { armorToSet = armorIndex; } } else if (((arg2 == 0 && i > j) || (arg2 < 0 && i > -arg2)) && (arg1 <= armorIndex)) { result = 0; break; } if (arg2 <= 0) { TakeInventory("BasicArmor", i); GiveInventory(ArmorItems[ArmorMode][armorToSet][0], 1); k = CheckInventory("Armor"); if (arg2 == 0) { break; } TakeInventory("BasicArmor", k-1); GiveInventory("InfiniteArmorBonus", -arg2 - 1); } else { TakeInventory("BasicArmor", i); GiveInventory(ArmorItems[ArmorMode][armorToSet][0], 1); k = CheckInventory("Armor"); TakeInventory("BasicArmor", k-1); GiveInventory("InfiniteArmorBonus", (i + arg2) - 1); } result = 1; break; case 21: i = CheckInventory("Armor"); if (i < arg1) { result = 0; break; } TakeInventory("BasicArmor", i-arg1); result = 1; break; case 22: result = GetCVar("samsara_nohealthcap"); break; case 23: GiveInventory("TimeBombPause", 1); Delay(arg1); TakeInventory("TimeBombPause", 1); break; case 24: result = GetCVar("samsara_noult"); break; case 25: if (GameType() == GAME_NET_COOPERATIVE) { AmbientSound("quake/invisannouncer",127); } else { LocalAmbientSound("quake/invisannouncer",127); } break; case 26: if (CheckInventory("PowerInvisibility") == 0) { GiveInventory("PowerInvisibility",1); } else { TakeInventory("PowerInvisibility",1); delay(1); GiveInventory("PowerShadow",1); delay(1); GiveInventory("PowerShadow",1); } break; case 27: result = GetCVar("samsara_nounique"); break; case 28: result = GetCVar("samsara_noinvuln"); break; case 29: result = GetCVar("instagib"); break; case 30: result = GetCVar("samsara_cl_bloodyhell"); break; case 31: result = GetCVar("samsara_cl_bloodypersistent"); break; case 32: result = GetCVar("samsara_nohealth"); break; case 33: result = GetCVar("samsara_vanillaquake"); break; }
NamedScript void ShopItemAutoHandler() { bool ItemsCurrent = false; bool ButtonHeld = false; // These are actually too big for the script auto handler to allocate properly, so they need to be static-scope here. RPGMap static int Items[ITEM_CATEGORIES][ITEM_MAX]; RPGMap static int PrevItems[ITEM_CATEGORIES][ITEM_MAX]; UpdateShopAutoList(); while (true) { // Auto-Sell/Store doesn't need to run constantly like run-pickup does. if (!GetActivatorCVar("drpg_pickup_behavior")) Delay(5); // Auto-Sell bool CanSellItems = Player.RankLevel > 0 || CurrentLevel->UACBase; bool UseAutoDepositFallback = GetActivatorCVar("drpg_autosell_lockerfallback"); if (CanSellItems || UseAutoDepositFallback) for (int i = 0; i < Player.AutoSellList.Position; i++) { ItemInfoPtr Item = ((ItemInfoPtr *)Player.AutoSellList.Data)[i]; int Quantity = CheckInventory(Item->Actor); // Keep if (Player.ItemKeep[Item->Category][Item->Index]) Quantity--; if (Quantity > 0 && !(Player.Mission.Active && Player.Mission.Type == MT_COLLECT && !StrCmp(Player.Mission.Item->Actor, Item->Actor))) { if (CanSellItems) SellItem(Item->Actor, Quantity, true); else if (UseAutoDepositFallback) ShopItemTryAutoDeposit(Item); } } // Auto-Store if (Player.EP >= LOCKER_EPRATE || CurrentLevel->UACBase) for (int i = 0; i < Player.AutoStoreList.Position; i++) { ItemInfoPtr Item = ((ItemInfoPtr *)Player.AutoStoreList.Data)[i]; if (CheckInventory(Item->Actor) > 0) ShopItemTryAutoDeposit(Item); } // Run-pickup. if (GetActivatorCVar("drpg_pickup_behavior")) { // Get input. ButtonHeld = CheckInput(BT_SPEED, KEY_HELD, false, PlayerNumber()); // For post-checks if (ButtonHeld) for (int i = 0; i < ItemCategories; i++) for (int j = 0; j < ItemMax[i]; j++) Items[i][j] = CheckInventory(ItemData[i][j].Actor); // Run-pickup behavior stuff if (ItemsCurrent && ButtonHeld) { for (int i = 0; i < ItemCategories; i++) for (int j = 0; j < ItemMax[i]; j++) { ItemInfoPtr Item = &ItemData[i][j]; // Auto-Sell if (!Player.InShop && GetActivatorCVar("drpg_pickup_behavior") == 1 && Items[i][j] > PrevItems[i][j]) if (CheckInventory(Item->Actor) > 0) SellItem(Item->Actor, true, true); // Auto-Store if (!Player.InShop && GetActivatorCVar("drpg_pickup_behavior") == 2 && Items[i][j] > PrevItems[i][j]) ShopItemTryAutoDeposit(Item); } } // Run-pickup has to run constantly or it might miss what the player ran over. Delay(1); // Prevent using old Items so we don't sell recently picked up stuff. if (!ButtonHeld) ItemsCurrent = false; if (ButtonHeld) ItemsCurrent = true; for (int i = 0; i < ItemCategories; i++) for (int j = 0; j < ItemMax[i]; j++) PrevItems[i][j] = Items[i][j]; } } }
script GRAPPLE_HOOK (int strength, int firetype) { int playerInput; int myX; int myY; int myZ; int firerPln = ACS_ExecuteWithResult(GETFIRERPLN, 0,0,0); int projTid = PROJOFFSET+firerPln; while (ThingCount(0, projTid) > 0) { projTid++; } Thing_ChangeTID(0, projTid); SetActivatorToTarget(0); while (ThingCount(0, projTid) > 0) { myX = GetActorX(projTid); myY = GetActorY(projTid); myZ = GetActorZ(projTid); playerInput = GetPlayerInput(-1, MODINPUT_BUTTONS); switch (firetype) { case 0: if (!(GetPlayerInput(-1, MODINPUT_BUTTONS) & BT_ALTATTACK)) { Thing_Remove(projTid); Spawn("GuaranteedTeleportFog", myX, myY, myZ-20.0); terminate; } break; case 1: if (!(GetPlayerInput(-1, MODINPUT_BUTTONS) & BT_ATTACK)) { Thing_Remove(projTid); Spawn("GuaranteedTeleportFog", myX, myY, myZ-20.0); terminate; } break; case 2: if (CheckInventory("InventoryToggle")) { Thing_Remove(projTid); Spawn("GuaranteedTeleportFog", myX, myY, myZ-20.0); terminate; } break; } Delay(1); } Spawn("GrappleSpot", myX, myY, myZ, projTid); ACS_ExecuteAlways(GRAPPLE_REEL, 0, projTid, strength, firetype); }
NamedScript void UpdateOverviewPanel(GUIPanel *OverviewPanel) { //------------------------- //Character //------------------------- GUILabels.NameLabel->Text = StrParam("%tS", PlayerNumber() + 1); GUILabels.LevelLabel->Text = StrParam("Level: %d", Player.Level); GUILabels.XPLabel->Text = StrParam("XP: %ld / %ld", Player.XP, Player.XPNext); GUILabels.TitleLabel->Text = StrParam("Title: %S (%d/%d)", Ranks[Player.RankLevel], Player.RankLevel, MAX_RANK); GUILabels.RankLabel->Text = StrParam("Rank: %ld / %ld", Player.Rank, Player.RankNext); if (Player.PayReady && !Player.PayingOut) GUILabels.PPLabel->Text = StrParam("PP: %d (%S) [\C[%S]Ready\C-]", Player.PP, FormatTime(Player.PayTimer), PayReadyColor); else GUILabels.PPLabel->Text = StrParam("PP: %d (%S)", Player.PP, FormatTime(Player.PayTimer)); //------------------------- //Inventory //------------------------- GUILabels.ModuleLabel->Text = StrParam("%d", CheckInventory("DRPGModule")); GUILabels.TurretPartsLabel->Text = StrParam("%d", CheckInventory("DRPGTurretPart")); GUILabels.AugChargeLabel->Text = StrParam("%d%% / %d%%", (int)Player.Augs.Battery, (int)Player.Augs.BatteryMax); GUILabels.AugSlotsLabel->Text = StrParam("%d / %d", Player.Augs.SlotsUsed, Player.Augs.Slots); GUILabels.AugUpgradesLabel->Text = StrParam("%d / %d", CheckInventory("DRPGAugCanister"), CheckInventory("DRPGAugUpgradeCanister")); GUILabels.StimsLabel->Text = StrParam("S: %d\nM: %d\nL: %d\nXL: %d", CheckInventory("DRPGStimSmall"), CheckInventory("DRPGStimMedium"), CheckInventory("DRPGStimLarge"), CheckInventory("DRPGStimXL")); GUILabels.ChipsGoldLabel->Text = StrParam("%d", CheckInventory("DRPGChipGold")); GUILabels.ChipsPlatLabel->Text = StrParam("%d", CheckInventory("DRPGChipPlatinum")); GUILabels.InventoryLabel->Text = StrParam("Inventory: %d / %d\n\CaBullets: %d / %d\n\CiShells: %d / %d\n\CcRockets: %d / %d\n\CdCells: %d / %d", Player.InvItems, CheckInventoryMax(), CheckInventory("Clip"), GetAmmoCapacity("Clip"), CheckInventory("Shell"), GetAmmoCapacity("Shell"), CheckInventory("RocketAmmo"), GetAmmoCapacity("RocketAmmo"), CheckInventory("Cell"), GetAmmoCapacity("Cell")); //----------------------------- //DRLA Inventory // if (CompatMode == COMPAT_DRLA) { int IsTechnician = (PlayerClass(PlayerNumber()) == 2); int Weapons = CheckInventory("RLWeaponLimit"); int Armors = CheckInventory("RLArmorInInventory"); int ModPacks = (IsTechnician ? CheckInventory("RLScavengerModLimit") : CheckInventory("RLModLimit")); int Skulls = CheckInventory("RLSkullLimit"); int Devices = CheckInventory("RLPhaseDeviceLimit"); GUILabels.DRLALabel->Text = StrParam("DRLA Inventory:\n%SWeapons: %d / 6\n%SArmor: %d / %d\n%SModpacks: %d / %d\n%SSkulls: %d / %d\n%SDevices: %d / %d", (Weapons >= 6 ? "\Cf" : "\Ca"), Weapons, (Armors >= DRLA_ARMOR_MAX ? "\Cf" : "\Cd"), Armors, DRLA_ARMOR_MAX, (((!IsTechnician && ModPacks >= 4) || (IsTechnician && ModPacks >= 8)) ? "\Cf" : "\Cc"), ModPacks, (IsTechnician ? 8 : 4), (Skulls >= DRLA_SKULL_MAX ? "\Cf" : "\Cr"), Skulls, DRLA_SKULL_MAX, (Devices >= DRLA_DEVICE_MAX ? "\Cf" : "\Ct"), Devices, DRLA_DEVICE_MAX); }