800 %{ #include "Entities/StdH/StdH.h" #include "Models/Items/ItemHolder/ItemHolder.h" %} %{ // used to render certain entities only for certain players (like picked items, etc.) extern ULONG _ulPlayerRenderingMask; %} class export CItem : CMovableModelEntity { name "Item"; thumbnail ""; features "HasName", "HasDescription", "IsTargetable", "CanBePredictable"; properties: 1 CTString m_strName "Name" 'N' = "Item", 2 CTString m_strDescription = "", // class properties 5 FLOAT m_fValue = 0.0f, // value 6 FLOAT m_fRespawnTime = 0.0f, // respawn time 7 BOOL m_bRespawn "Respawn" 'R' = FALSE, // respawn item 8 CEntityPointer m_penTarget "Target" 'T' COLOR(C_dGRAY|0xFF), // target to trigger when crossed over 9 BOOL m_bPickupOnce "PickupOnce" 'P' = FALSE, // can be picked by only one player, triggers only when really picked 10 CSoundObject m_soPick, // sound channel 12 FLOAT m_fPickSoundLen = 0.0f, 14 BOOL m_bDropped = FALSE, // dropped by a player during a deathmatch game 15 INDEX m_ulPickedMask = 0, // mask for which players picked this item components: 1 model MODEL_ITEM "Models\\Items\\ItemHolder\\ItemHolder.mdl", functions: virtual void AdjustDifficulty(void) { } /* Adjust model mip factor if needed. */ void AdjustMipFactor(FLOAT &fMipFactor) { // adjust flare glow, to decrease power with how you get closer CAttachmentModelObject *pamo = GetModelObject()->GetAttachmentModel(ITEMHOLDER_ATTACHMENT_FLARE); if( pamo != NULL) { FLOAT fRatio = (Clamp( fMipFactor, 5.0f, 7.0f)-5.0f)/2.0f; UBYTE ubRatio = UBYTE(255*fRatio); COLOR colMutiply = RGBToColor(ubRatio,ubRatio,ubRatio)|CT_OPAQUE; pamo->amo_moModelObject.mo_colBlendColor = colMutiply; } // if never picked if (m_ulPickedMask==0) { // don't bother testing return; } //BOOL bFlare = TRUE; // if current player has already picked this item if (_ulPlayerRenderingMask&m_ulPickedMask) { // if picked items are not rendered extern INDEX plr_bRenderPicked; if (!plr_bRenderPicked) { // kill mip factor fMipFactor = UpperLimit(0.0f); } // if picked item particles are not rendered extern INDEX plr_bRenderPickedParticles; /*if (!plr_bRenderPickedParticles) { // kill flare bFlare = FALSE; // DG: bFlare is not otherwise used! }*/ } // implement flare on/off ? } // check whether should render particles for this item BOOL ShowItemParticles(void) { // if current player has already picked this item if (_ulPlayerRenderingMask&m_ulPickedMask) { // if picked item particles are not rendered extern INDEX plr_bRenderPickedParticles; if (!plr_bRenderPickedParticles) { // don't render return FALSE; } } // otherwise, render return TRUE; } // check if given player already picked this item, and mark if not BOOL MarkPickedBy(CEntity *pen) { if (!IsOfClass(pen, "Player")) { return FALSE; } INDEX iPlayer = ((CPlayerEntity*)pen)->GetMyPlayerIndex(); BOOL bPickedAlready = (1<GetAttachmentModel(ITEMHOLDER_ATTACHMENT_ITEM)->amo_moModelObject; AddAttachmentToModel(this, mo, iAttachment, ulIDModel, ulIDTexture, ulIDReflectionTexture, ulIDSpecularTexture, ulIDBumpTexture); }; // set animation of attachment void SetItemAttachmentAnim(INDEX iAttachment, INDEX iAnim) { CModelObject &mo = GetModelObject()->GetAttachmentModel(ITEMHOLDER_ATTACHMENT_ITEM)->amo_moModelObject. GetAttachmentModel(iAttachment)->amo_moModelObject; mo.PlayAnim(iAnim, 0); } // Add flare void AddFlare(ULONG ulIDModel, ULONG ulIDTexture, const FLOAT3D &vPos, const FLOAT3D &vStretch) { // add flare to items if not respawn if( !m_bRespawn && !m_bDropped) { AddAttachmentToModel(this, *GetModelObject(), ITEMHOLDER_ATTACHMENT_FLARE, ulIDModel, ulIDTexture, 0,0,0); CAttachmentModelObject &amo = *GetModelObject()->GetAttachmentModel(ITEMHOLDER_ATTACHMENT_FLARE); amo.amo_moModelObject.StretchModel(vStretch); amo.amo_plRelative.pl_PositionVector = vPos; } }; // Stretch item void StretchItem(const FLOAT3D &vStretch) { CModelObject &mo = GetModelObject()->GetAttachmentModel(ITEMHOLDER_ATTACHMENT_ITEM)->amo_moModelObject; mo.StretchModel(vStretch); ModelChangeNotify(); }; procedures: /************************************************************ * VIRTUAL PROCEDURES THAT NEED OVERRIDE * ************************************************************/ ItemCollected(EPass epass) { return; }; /************************************************************ * I T E M L O O P * ************************************************************/ ItemLoop(EVoid) { autowait(0.1f); SetPredictable(TRUE); AdjustDifficulty(); wait() { on (EBegin) : { resume; } on (EPass epass) : { if (!IsOfClass(epass.penOther, "Player")) { pass; } if (!m_bPickupOnce) { SendToTarget(m_penTarget, EET_TRIGGER, epass.penOther); m_penTarget = NULL; } call ItemCollected(epass); } on (EEnd) : { stop; } } // wait for sound to end autowait(m_fPickSoundLen+0.5f); // cease to exist Destroy(); return; }; ItemReceived(EVoid) { // hide yourself SwitchToEditorModel(); if (m_bPickupOnce) { SendToTarget(m_penTarget, EET_TRIGGER, NULL); } // respawn item if (m_bRespawn) { ASSERT(m_fRespawnTime>0.0f); // wait to respawn wait(m_fRespawnTime) { on (EBegin) : { resume; } on (ETimer) : { stop; } otherwise() : { resume; } } // show yourself SwitchToModel(); // cease to exist } else { return EEnd(); } return; }; };