/* * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "precompiled.h" LINK_ENTITY_TO_CLASS(item_airbox, CItemAirBox, CCSItemAirBox); void CItemAirBox::Spawn() { CArmoury::Spawn(); pev->movetype = MOVETYPE_NOCLIP; if (!m_iszSpriteName.IsNull()) { m_hSprite.Remove(); m_hSprite = CSprite::SpriteCreate(m_iszSpriteName, pev->origin, FALSE); m_hSprite->SetTransparency(m_rendermode, m_rendercolor.x, m_rendercolor.y, m_rendercolor.z, m_renderamt, m_renderfx); m_hSprite->SetScale(m_scale); m_hSprite->SetAttachment(edict(), pev->body); m_hSprite->pev->spawnflags |= SF_SPRITE_STARTON; m_hSprite->pev->framerate = m_frameRate; m_hSprite->TurnOn(); } if (m_flyup > 0 && m_delay > 0.01f) { SetThink(&CItemAirBox::MoveUp); pev->nextthink = gpGlobals->time + 1.0f; } } void CItemAirBox::OnDestroy() { m_hSprite.Remove(); } void CItemAirBox::Touch(CBaseEntity *pOther) { CArmoury::Touch(pOther); // airbox was picked up, so sprite to turn off if ((pev->effects & EF_NODRAW) == EF_NODRAW) { m_hSprite->TurnOff(); pev->nextthink = 0; SetThink(nullptr); pev->velocity = g_vecZero; } } void CItemAirBox::Restart() { CArmoury::Restart(); UTIL_SetOrigin(pev, pev->oldorigin); pev->velocity = g_vecZero; if (m_flyup < 0) { m_flyup = -m_flyup; } if (m_flyup > 0 && m_delay > 0.01f) { SetThink(&CItemAirBox::MoveUp); pev->nextthink = gpGlobals->time + 0.1f; } } void CItemAirBox::Precache() { CArmoury::Precache(); if (!m_iszSpriteName.IsNull()) { PRECACHE_MODEL(m_iszSpriteName); } } void CItemAirBox::KeyValue(KeyValueData *pkvd) { if (FStrEq(pkvd->szKeyName, "flyup")) { m_flyup = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "delay")) { m_delay = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_model")) { m_iszSpriteName = ALLOC_STRING(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_renderfx")) { m_renderfx = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_rendermode")) { m_rendermode = Q_atoi(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_renderamt")) { m_renderamt = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_rendercolor")) { UTIL_StringToVector(m_rendercolor, pkvd->szValue, ' '); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_scale")) { m_scale = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else if (FStrEq(pkvd->szKeyName, "sprite_framerate")) { m_frameRate = Q_atof(pkvd->szValue); pkvd->fHandled = TRUE; } else { CArmoury::KeyValue(pkvd); } } void CItemAirBox::MoveUp() { pev->velocity.z = m_flyup; m_flyup = -m_flyup; pev->nextthink = gpGlobals->time + m_delay; }