123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691 |
- //---------------------------------------------------------------------------
- //
- // weaponbolt.cpp -- File contains the WeaponBolt Object code
- //
- // MechCommander 2
- //
- //---------------------------------------------------------------------------//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- //---------------------------------------------------------------------------
- // Include Files
- #ifndef MCLIB_H
- #include "mclib.h"
- #endif
- #ifndef WEAPONBOLT_H
- #include "weaponbolt.h"
- #endif
- #ifndef GAMESOUND_H
- #include "gamesound.h"
- #endif
- #ifndef OBJMGR_H
- #include "objmgr.h"
- #endif
- #ifndef WEAPONFX_H
- #include "weaponfx.h"
- #endif
- #ifndef MULTPLYR_H
- #include "multplyr.h"
- #endif
- #ifndef MISSION_H
- #include "mission.h"
- #endif
- #include <gameos.hpp>
- //---------------------------------------------------------------------------
- extern bool hasGuardBand;
- extern MidLevelRenderer::MLRClipper * theClipper;
- extern bool drawOldWay;
- extern float BaseHeadShotElevation;
- extern bool useNonWeaponEffects;
- extern bool MLRVertexLimitReached;
- #define BASE_EFFECT_SCALAR 1.0f
- #define EFFECT_LEFT_TIME 1.0f
- #define WEAPON_ARC_FACTOR -20.0f
- #define WEAPON_ARC_HEIGHT 150.0f
- #define ARC_THRESHOLD 0.0f
- //---------------------------------------------------------------------------
- // class WeaponBoltType
- //---------------------------------------------------------------------------
- GameObjectPtr WeaponBoltType::createInstance (void)
- {
- WeaponBoltPtr result = new WeaponBolt;
- if (!result)
- return NULL;
- result->init(true, this);
-
- return(result);
- }
- //---------------------------------------------------------------------------
- void WeaponBoltType::destroy (void)
- {
- if (textureName)
- ObjectTypeManager::objectCache->Free(textureName);
-
- textureName = NULL;
- ObjectType::destroy();
- }
- //---------------------------------------------------------------------------
- DWORD bgrTorgb (DWORD frontRGB);
-
- //---------------------------------------------------------------------------
- long WeaponBoltType::init (FilePtr objFile, unsigned long fileSize)
- {
- long result = 0;
-
- FitIniFile bullFile;
- result = bullFile.open(objFile,fileSize);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to open File");
-
- //------------------------------------------------------------------
- result = bullFile.seekBlock("BoltProjectileData");
- if (result != NO_ERR)
- {
- //Check if we are a NEW beam type.
- result = bullFile.seekBlock("BeamProjectileData");
- if (result != NO_ERR)
- {
- STOP(("WeaponBoltTYpe::init -- Not a valid weaponBolt"));
- }
-
- result = bullFile.readIdBoolean("IsBeam",isBeam);
- if (result != NO_ERR)
- isBeam = false;
-
- result = bullFile.readIdFloat("BeamDuration",beamDuration);
- if (result != NO_ERR)
- beamDuration = 0.0f;
-
- result = bullFile.readIdFloat("BeamWiggle",beamWiggle);
- if (result != NO_ERR)
- beamWiggle = 0.0f;
-
- result = bullFile.readIdBoolean("PointLight",lightSource);
- if (result != NO_ERR)
- lightSource = false;
-
- char txmName[1024];
- result = bullFile.readIdString("TextureName",txmName,1023);
- if (result != NO_ERR)
- strcpy(txmName,"NONE");
-
- textureName = (char *)ObjectTypeManager::objectCache->Malloc(strlen(txmName)+1);
- strcpy(textureName,txmName);
- result = bullFile.readIdFloat("UVAnimRate",uvAnimRate);
- if (result != NO_ERR)
- uvAnimRate = 0.0f;
-
- result = bullFile.readIdFloat("UVRepeat",uvRepeat);
- if (result != NO_ERR)
- uvRepeat = 1.0f;
-
- result = bullFile.readIdFloat("UnitLength",unitLength);
- if (result != NO_ERR)
- unitLength = 1.0f;
-
- if (unitLength < Stuff::SMALL)
- unitLength = 1.0f;
- result = bullFile.readIdBoolean("MipTexture",mipTexture);
- if (result != NO_ERR)
- mipTexture = false;
-
- result = bullFile.readIdLong("FiringSoundFX",fireSoundFX);
- if (result != NO_ERR)
- fireSoundFX = 0;
-
- result = bullFile.readIdFloat("BulgeWidth",bulgeWidth);
- if (result != NO_ERR)
- bulgeWidth = 1.0f;
-
- result = bullFile.readIdULong("MidEdgeRGB",midEdgeRGB);
- if (result != NO_ERR)
- midEdgeRGB = 0x00ffffff;
-
- result = bullFile.readIdULong("MiddleRGB",middleRGB);
- if (result != NO_ERR)
- middleRGB = 0x00ffffff;
-
- result = bullFile.readIdUChar("EdgeAlpha",edgeAlpha);
- if (result != NO_ERR)
- edgeAlpha = 0xff;
-
- result = bullFile.readIdUChar("BoltAlpha",boltAlpha);
- if (result != NO_ERR)
- boltAlpha = 0xff;
-
- projLength = 1.0f;
- velocity = 1.0f;
-
- if (lightSource)
- {
- result = bullFile.readIdULong("LightRGB",lightRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find lightRGB");
-
- result = bullFile.readIdFloat("MaxRadius",maxRadius);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find maxRadius");
-
- result = bullFile.readIdFloat("OutRadius",outRadius);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find outRadius");
-
- result = bullFile.readIdFloat("Intensity",intensity);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find intensity");
- }
- }
- else
- {
- result = bullFile.readIdFloat("ProjectileLength",projLength);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find projectileLength");
-
- result = bullFile.readIdFloat("BulgeLength",bulgeLength);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find bulgeLength");
-
- result = bullFile.readIdFloat("BulgeWidth",bulgeWidth);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find bulgeWidth");
-
- result = bullFile.readIdFloat("Velocity",velocity);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find velocity");
-
- result = bullFile.readIdLong("HitEffect",hitEffectObjNum);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find HitEffect");
-
- result = bullFile.readIdLong("MissEffect",missEffectObjNum);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find missEffect");
-
- result = bullFile.readIdLong("FiringSoundFX",fireSoundFX);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find FiringSoundFx");
-
- result = bullFile.readIdULong("FrontRGB",frontRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find FrontRGB");
-
- result = bullFile.readIdULong("MidEdgeRGB",midEdgeRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find MIDEDGERGB");
-
- result = bullFile.readIdULong("MiddleRGB",middleRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find MiddleRGB");
-
- result = bullFile.readIdULong("BackRGB",backRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find backRGB");
-
- result = bullFile.readIdUChar("EdgeAlpha",edgeAlpha);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find edgeAlpha");
-
- result = bullFile.readIdUChar("BoltAlpha",boltAlpha);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find boltAlpha");
-
- result = bullFile.readIdBoolean("IsBeam",isBeam);
- if (result != NO_ERR)
- isBeam = false;
-
- result = bullFile.readIdFloat("BeamDuration",beamDuration);
- if (result != NO_ERR)
- beamDuration = 0.0f;
-
- result = bullFile.readIdFloat("BeamWiggle",beamWiggle);
- if (result != NO_ERR)
- beamWiggle = 0.0f;
-
- result = bullFile.readIdBoolean("PointLight",lightSource);
- if (result != NO_ERR)
- lightSource = false;
- result = bullFile.readIdBoolean("ArcEffect",arcEffect);
- if (result != NO_ERR)
- arcEffect = false;
-
- result = bullFile.readIdFloat("ArcHeight",arcHeight);
- if (result != NO_ERR)
- arcHeight = -1.0f;
- result = bullFile.readIdFloat("AfterHitTime",afterHitTime);
- if (result != NO_ERR)
- afterHitTime = 0.0f;
-
- result = bullFile.readIdFloat("AreaEffectDamage",areaEffectDmg);
- if (result != NO_ERR)
- areaEffectDmg = 0.0f;
-
- result = bullFile.readIdFloat("AreaEffectRadius",areaEffectRad);
- if (result != NO_ERR)
- areaEffectRad = 0.0f;
-
- if (lightSource)
- {
- result = bullFile.readIdULong("LightRGB",lightRGB);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find lightRGB");
-
- result = bullFile.readIdFloat("MaxRadius",maxRadius);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find maxRadius");
-
- result = bullFile.readIdFloat("OutRadius",outRadius);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find outRadius");
-
- result = bullFile.readIdFloat("Intensity",intensity);
- if (result != NO_ERR)
- Fatal(result,"WeaponBoltType::init -- Unable to find intensity");
- }
-
- //------------------------------------------------------------------
- // Editor writes RGBs as BGRs. Change over here.
- frontRGB = bgrTorgb(frontRGB);
- backRGB = bgrTorgb(backRGB);
- middleRGB = bgrTorgb(middleRGB);
- midEdgeRGB = bgrTorgb(midEdgeRGB);
- lightRGB = bgrTorgb(lightRGB);
- }
-
- //------------------------------------------------------------------
- // Initialize the base object Type from the current file.
- result = ObjectType::init(&bullFile);
-
- return(result);
- }
-
- //---------------------------------------------------------------------------
- bool WeaponBoltType::handleCollision (GameObjectPtr collidee, GameObjectPtr collider)
- {
- //-------------------------------------------------------
- // The bolt ceases to exist when its effect is done.
- // always return FALSE or the collision will make it
- // go away!
-
- return(FALSE);
- }
- //---------------------------------------------------------------------------
- bool WeaponBoltType::handleDestruction (GameObjectPtr collidee, GameObjectPtr collider)
- {
- //-------------------------------------------------------
- // The bolt ceases to exist when its effect is done.
- // always return FALSE or the collision will make it
- // go away!
-
- return(FALSE);
- }
- //---------------------------------------------------------------------------
- TG_LightPtr WeaponBoltType::getLight (void)
- {
- TG_LightPtr pointLight = NULL;
- if (lightSource)
- {
- pointLight = (TG_LightPtr)systemHeap->Malloc(sizeof(TG_Light));
- pointLight->init(TG_LIGHT_POINT);
- pointLight->SetaRGB(lightRGB);
- pointLight->SetIntensity(intensity);
- pointLight->SetFalloffDistances(maxRadius,outRadius);
- }
- return(pointLight);
- }
- //---------------------------------------------------------------------------
- // class WeaponBolt
- //---------------------------------------------------------------------------
- bool WeaponBolt::isVisible (void)
- {
- //----------------------------------------------------------------------
- // This function checks to see if this weaponBolt is visible on screen
- bool isVisible = true;
- if (isVisible)
- {
- windowsVisible = turn;
- }
-
- return(true);
- }
- //---------------------------------------------------------------------------
- long WeaponBolt::update (void)
- {
- Stuff::Vector3D laserDirection;
-
- bool moveThisFrame = true;
- if (getFlag(OBJECT_FLAG_JUSTCREATED))
- {
- setFlag(OBJECT_FLAG_JUSTCREATED, false);
- setFlag(OBJECT_FLAG_TANGIBLE, false);
-
- hitTarget = false;
- moveThisFrame = false;
- //-------------------------------------------------------------
- // Update position relative to my owner
- GameObjectPtr myOwner = ObjectManager->getByWatchID(ownerWID);
- if (myOwner)
- {
- position = myOwner->getPositionFromHS(hotSpotNumber);
- }
- //-------------------------------------------------------------------
- // If we were just Created, play our sound Effect.
- if (((WeaponBoltTypePtr)getObjectType())->fireSoundFX != 0)
- soundSystem->playDigitalSample(((WeaponBoltTypePtr)getObjectType())->fireSoundFX, position, true);
-
- laserPosition = position;
-
- Stuff::Vector3D ownerPosition = laserPosition;
- Stuff::Point3D actualPosition;
- actualPosition.x = -laserPosition.x;
- actualPosition.y = laserPosition.z;
- actualPosition.z = laserPosition.y;
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
-
- Stuff::Vector3D targetPos;
- targetPos.Zero();
- if (target)
- {
- if (!target->isMech())
- {
- setTargetPosition(target->getPositionFromHS(targetHotSpot));
- }
- else
- {
- if (targetHotSpot)
- setTargetPosition(target->appearance->getHitNodeLeft());
- else
- setTargetPosition(target->appearance->getHitNodeRight());
- }
- }
-
- if (targetPosition)
- {
- targetPos = *targetPosition;
- }
- else
- {
- //Somehow, we are updating a fresh weaponbolt which has not been connected.
- // Do not allow it to go on or we will crash for sure.
- return false;
- }
-
- laserDirection.Subtract(targetPos,ownerPosition);
- if (laserDirection.GetLength() != 0.0)
- laserDirection.Normalize(laserDirection);
- laserDirection *= ((WeaponBoltTypePtr)getObjectType())->projLength;
- //laserPosition.Add(laserPosition,laserDirection);
-
- if (((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- timeLeft = ((WeaponBoltTypePtr)getObjectType())->beamDuration;
- actualPosition.x = -(*targetPosition).x; //Play the beam hitting effect at the hit location
- actualPosition.y = (*targetPosition).z;
- actualPosition.z = (*targetPosition).y;
- }
- else
- timeLeft = 0.0f;
-
- if (gosEffect && gosEffect->IsExecuted())
- {
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(actualPosition);
-
- rotation = -world_angle_between(position, *targetPosition);
- Stuff::UnitQuaternion effectRot;
- effectRot = Stuff::EulerAngles(0.0f,rotation * DEGREES_TO_RADS,0.0f);
- localToWorld.Multiply(gosFX::Effect_Against_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&localResult,NULL);
- gosEffect->Start(&info);
- }
-
- if (muzzleEffect && muzzleEffect->IsExecuted())
- {
- Stuff::Point3D mPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- mPosition.x = -position.x;
- mPosition.y = position.z;
- mPosition.z = position.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(mPosition);
-
- Stuff::UnitQuaternion effectRot;
- if (myOwner)
- effectRot = Stuff::EulerAngles(0.0f, myOwner->getRotation() * DEGREES_TO_RADS,0.0f);
- else
- effectRot = Stuff::EulerAngles(0.0f, 0.0f ,0.0f);
- localToWorld.Multiply(gosFX::Effect_Into_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&localResult,NULL);
- muzzleEffect->Start(&info);
- }
-
- Stuff::Vector3D laserVelocity;
- laserVelocity.Subtract(targetPos,ownerPosition);
- float distance = laserVelocity.x * laserVelocity.x + laserVelocity.y * laserVelocity.y;
- distanceToTarget = distance;
- halfDistanceToTarget = distance / 2.0f;
-
- goalHeight = ((WeaponBoltTypePtr)getObjectType())->arcHeight;
- goalHeight *= 10.0f;
- }
- //-------------------------------------------------------------
- // Update position relative to my owner
- GameObjectPtr myOwner = ObjectManager->getByWatchID(ownerWID);
- if (myOwner)
- position = myOwner->getPositionFromHS(hotSpotNumber);
-
- bool inView = TRUE;
- //---------------------
- //Update beamDuration
- if (((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- timeLeft -= frameLength;
- if (timeLeft >= 0.0f)
- {
- gosTextureHandle = mcTextureManager->get_gosTextureHandle(mcTextureHandle);
- mcTextureManager->addTriangle(mcTextureHandle,MC2_ISEFFECTS|MC2_DRAWONEIN);
- mcTextureManager->addTriangle(mcTextureHandle,MC2_ISEFFECTS|MC2_DRAWONEIN);
- mcTextureManager->addTriangle(mcTextureHandle,MC2_ISEFFECTS|MC2_DRAWONEIN);
- mcTextureManager->addTriangle(mcTextureHandle,MC2_ISEFFECTS|MC2_DRAWONEIN);
- }
- startUV += ((WeaponBoltTypePtr)getObjectType())->uvAnimRate * frameLength;
- }
- else if (!gosEffect && !((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- mcTextureManager->addTriangle(0xffffffff,MC2_DRAWALPHA);
- mcTextureManager->addTriangle(0xffffffff,MC2_DRAWALPHA);
- mcTextureManager->addTriangle(0xffffffff,MC2_DRAWALPHA);
- mcTextureManager->addTriangle(0xffffffff,MC2_DRAWALPHA);
- }
-
- //---------------------------------------------------------------
- // Keep projectile flying toward target. Even if Target Moves!!
- Stuff::Vector3D ownerPosition = laserPosition;
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
-
- Stuff::Vector3D targetPos;
- targetPos.Zero();
- if (target && (!hitTarget || ((WeaponBoltTypePtr)getObjectType())->isBeam))
- {
- if (!target->isMech())
- {
- setTargetPosition(target->getPositionFromHS(targetHotSpot));
- }
- else
- {
- if (targetHotSpot)
- setTargetPosition(target->appearance->getHitNodeLeft());
- else
- setTargetPosition(target->appearance->getHitNodeRight());
- }
- }
-
- if (targetPosition)
- {
- targetPos = *targetPosition;
- }
-
- Stuff::Vector3D laserVelocity;
- float velMag = ((WeaponBoltTypePtr)getObjectType())->velocity;
- velMag *= frameLength;
-
- laserVelocity.Subtract(targetPos,ownerPosition);
- float distance = laserVelocity.x * laserVelocity.x + laserVelocity.y * laserVelocity.y;
-
- //----------------------------------------------------------------------
- // For the first half of the distance, bring weapons up if NOT beam!!!
- bool isArcing = false;
- if (((WeaponBoltTypePtr)getObjectType())->arcEffect)
- {
- //GoalHeight is actually the velocity
- if ( goalHeight > 0.0f )
- {
- float accel = -((WeaponBoltTypePtr)getObjectType())->arcHeight * 10.0f;
- goalHeight += accel * frameLength;
- if (goalHeight >= 0.0f)
- {
- laserVelocity.z = goalHeight;
- isArcing = true;
- }
- }
- }
- //-------------------------------------------------------------------
- // Make the bullets go away when they get close enough to the target.
- // This is determined by checking the distanceToTarget. A soon as it
- // starts to get bigger, we have passed the target and "hit" it.
- if (!hitTarget)
- {
- if (!((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- float lastDistanceMoved = distanceToTarget - distance;
- distanceToTarget = distance;
-
- if (lastDistanceMoved >= distance)
- {
- hitTarget = TRUE;
- hitLeft = ((WeaponBoltTypePtr)getObjectType())->afterHitTime;
-
- if (target)
- {
- Stuff::Vector3D hotSpot = target->getPositionFromHS(targetHotSpot);
- if (target->isMech())
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- if (hitEffect && hitEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- hitEffect->Start(&info);
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Put effect ON the spot!!
- laserPosition = hotSpot;
- }
- else
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- long cellR, cellC;
- land->worldToCell(hotSpot,cellR, cellC);
- if (GameMap->getDeepWater(cellR, cellC) || GameMap->getShallowWater(cellR, cellC))
- {
- if (waterMissEffect && waterMissEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = Terrain::waterElevation;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- waterMissEffect->Start(&info);
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
- }
- else
- {
- if (missEffect && missEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- missEffect->Start(&info);
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
- }
-
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
-
- //Put effect ON the spot!!
- laserPosition = hotSpot;
- }
-
- //--------------------------------
- // Laser has hit target.
- if (target)
- {
- //Figure out angle between target and Shooter if target is BELOW shooter.
- // If no shooter, no bonus!!
- GameObjectPtr owner = ObjectManager->getByWatchID(ownerWID);
- if (owner)
- {
- if (target->getPosition().z < owner->getPosition().z)
- {
- Stuff::Vector3D targetPos = target->getPosition();
- Stuff::Vector3D ownerPos = owner->getPosition();
-
- float zDistance = ownerPos.z - targetPos.z;
- targetPos.z = ownerPos.z = 0.0f;
-
- Stuff::Vector3D distance;
- distance.Subtract(ownerPos,targetPos);
-
- float yDistance = distance.GetApproximateLength();
-
- float angle = mc2_atan2(zDistance,yDistance) * RADS_TO_DEGREES;
-
- if (RollDice(angle * BaseHeadShotElevation))
- {
- weaponShot.hitLocation = 0; //Make it a head shot!
- }
-
- }
- }
-
- if (((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectDmg > 0.0f) &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectRad > 0.0f))
- {
- //This is an area effect weapon. Hit or MISS, its the same!
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Create the explosion here. HIT or MISS, its the same one!!
- // Damage is done by explosion NOT by hit!
- ObjectManager->createExplosion(((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum,
- NULL,*targetPosition,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectDmg,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectRad);
- }
- else
- {
- if (MPlayer)
- {
- if (MPlayer->isServer())
- target->handleWeaponHit(&weaponShot, true);
- }
- else
- target->handleWeaponHit(&weaponShot);
- }
- }
- else if (targetPosition)
- {
- long randomCrater = 0;
- if (weaponShot.damage > 9)
- randomCrater = 3;
- else if (weaponShot.damage > 6)
- randomCrater = 2;
- else if (weaponShot.damage > 3)
- randomCrater = 1;
-
- if (missEffect) //We missed and hit land. Otherwise, we hit water, do NOT add crater
- craterManager->addCrater(CRATER_1+randomCrater,*targetPosition,RandomNumber(180));
-
- //if (MasterComponentList[weaponShot.masterId].getWeaponAmmoType() != WEAPON_AMMO_NONE)
- // energy weapons don't set off mines
- // Yes, they should DT, 5/30/98
- {
- long cellRow, cellCol;
-
- land->worldToCell(*targetPosition, cellRow, cellCol);
- if (GameMap->getMine(cellRow, cellCol) == 1)
- {
- ObjectManager->createExplosion(MINE_EXPLOSION_ID, NULL, *targetPosition, MineSplashDamage, MineSplashRange * worldUnitsPerMeter);
- GameMap->setMine(cellRow, cellCol, 2);
- }
- }
-
- if (((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectDmg > 0.0f) &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectRad > 0.0f))
- {
- //This is an area effect weapon. Hit or MISS, its the same!
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Create the explosion here. HIT or MISS, its the same one!!
- // Damage is done by explosion NOT by hit!
- ObjectManager->createExplosion(((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum,
- NULL,*targetPosition,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectDmg,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectRad);
- }
- }
- }
- }
- else
- {
- if (timeLeft < 0.0)
- {
- hitTarget = TRUE;
-
- if (target)
- {
- Stuff::Vector3D hotSpot = target->getPositionFromHS(targetHotSpot);
- if (target->isMech())
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- if (hitEffect && hitEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- hitEffect->Start(&info);
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
- }
- else
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- long cellR, cellC;
- land->worldToCell(hotSpot,cellR, cellC);
- if (GameMap->getDeepWater(cellR, cellC) || GameMap->getShallowWater(cellR, cellC))
- {
- if (waterMissEffect && waterMissEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = Terrain::waterElevation;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- waterMissEffect->Start(&info);
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
- }
- else
- {
- if (missEffect && missEffect->IsExecuted())
- {
- Stuff::Point3D tPosition;
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,NULL);
- missEffect->Start(&info);
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
- }
-
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
- }
-
- //--------------------------------
- // Laser has hit target.
- if (target)
- {
- //Figure out angle between target and Shooter if target is BELOW shooter.
- // If no shooter, no bonus!!
- GameObjectPtr owner = ObjectManager->getByWatchID(ownerWID);
- if (owner)
- {
- if (target->getPosition().z < owner->getPosition().z)
- {
- Stuff::Vector3D targetPos = target->getPosition();
- Stuff::Vector3D ownerPos = owner->getPosition();
- float zDistance = ownerPos.z - targetPos.z;
- targetPos.z = ownerPos.z = 0.0f;
- Stuff::Vector3D distance;
- distance.Subtract(ownerPos,targetPos);
- float yDistance = distance.GetApproximateLength();
- float angle = mc2_atan2(zDistance,yDistance) * RADS_TO_DEGREES;
- if (RollDice(angle * BaseHeadShotElevation))
- {
- weaponShot.hitLocation = 0; //Make it a head shot!
- }
- }
- }
-
- if (((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectDmg > 0.0f) &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectRad > 0.0f))
- {
- //This is an area effect weapon. Hit or MISS, its the same!
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Create the explosion here. HIT or MISS, its the same one!!
- // Damage is done by explosion NOT by hit!
- ObjectManager->createExplosion(((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum,
- NULL,*targetPosition,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectDmg,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectRad);
- }
- else
- {
- if (MPlayer)
- {
- if (MPlayer->isServer())
- target->handleWeaponHit(&weaponShot, true);
- }
- else
- target->handleWeaponHit(&weaponShot);
- }
- }
- else if (targetPosition)
- {
- long randomCrater = 0;
- if (weaponShot.damage > 9)
- randomCrater = 3;
- else if (weaponShot.damage > 6)
- randomCrater = 2;
- else if (weaponShot.damage > 3)
- randomCrater = 1;
-
- if (missEffect)
- craterManager->addCrater(CRATER_1+randomCrater,*targetPosition,RandomNumber(180));
-
- //if (MasterComponentList[weaponShot.masterId].getWeaponAmmoType() != WEAPON_AMMO_NONE)
- // energy weapons don't set off mines
- // Yes, they should DT, 5/30/98
- {
- long cellRow, cellCol;
-
- land->worldToCell(*targetPosition, cellRow, cellCol);
- if (GameMap->getMine(cellRow, cellCol) == 1)
- {
- ObjectManager->createExplosion(MINE_EXPLOSION_ID, NULL, *targetPosition, MineSplashDamage, MineSplashRange * worldUnitsPerMeter);
- GameMap->setMine(cellRow, cellCol, 2);
- }
- }
-
- if (((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectDmg > 0.0f) &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectRad > 0.0f))
- {
- //This is an area effect weapon. Hit or MISS, its the same!
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
-
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
-
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Create the explosion here. HIT or MISS, its the same one!!
- // Damage is done by explosion NOT by hit!
- ObjectManager->createExplosion(((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum,
- NULL,*targetPosition,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectDmg,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectRad);
- }
- }
- }
- }
- }
-
- //Actually move the effect toward the target
- // But only AFTER the first Start for the effect
- // Otherwise, weapon moves one time of flight distant
- if (!hitTarget)
- {
- float tmpZ = laserVelocity.z;
- if (isArcing)
- {
- laserVelocity.z = 0.0f;
- tmpZ *= frameLength;
- }
-
- if (laserVelocity.GetLength() != 0.0)
- laserVelocity.Normalize(laserVelocity);
-
- if (moveThisFrame)
- {
- laserVelocity *= velMag;
- if (isArcing)
- laserVelocity.z = tmpZ;
- }
-
- laserPosition += laserVelocity;
-
- laserDirection.Negate(laserVelocity);
- if (laserDirection.GetLength() != 0.0)
- laserDirection.Normalize(laserDirection);
- }
- //------------------------------------------------
- // Update GOSFX
- if (gosEffect && gosEffect->IsExecuted())
- {
- Stuff::Point3D actualPosition;
- if (((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- actualPosition.x = -(*targetPosition).x; //Play the beam hitting effect at the hit location
- actualPosition.y = (*targetPosition).z;
- actualPosition.z = (*targetPosition).y;
- }
- else
- {
- actualPosition.x = -laserPosition.x;
- actualPosition.y = laserPosition.z;
- actualPosition.z = laserPosition.y;
- }
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(actualPosition);
-
- rotation = -world_angle_between(laserPosition, *targetPosition);
-
- Stuff::UnitQuaternion effectRot;
- effectRot = Stuff::EulerAngles(0.0f,rotation * DEGREES_TO_RADS,0.0f);
- localToWorld.Multiply(gosFX::Effect_Against_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- Stuff::OBB boundingBox;
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&localResult,&boundingBox);
- bool result = gosEffect->Execute(&info);
- if (!result)
- {
- gosEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete gosEffect;
- gosEffect = NULL;
- }
- }
-
- if (muzzleEffect && muzzleEffect->IsExecuted())
- {
- Stuff::Point3D mPosition;
- mPosition.x = -position.x;
- mPosition.y = position.z;
- mPosition.z = position.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(mPosition);
- Stuff::UnitQuaternion effectRot;
- if (myOwner)
- effectRot = Stuff::EulerAngles(0.0f, myOwner->getRotation() * DEGREES_TO_RADS,0.0f);
- else
- effectRot = Stuff::EulerAngles(0.0f, 0.0f ,0.0f);
- localToWorld.Multiply(gosFX::Effect_Into_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- Stuff::OBB boundingBox;
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&localResult,&boundingBox);
- bool result = muzzleEffect->Execute(&info);
- if (!result)
- {
- muzzleEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
- }
- if (!hitTarget && !((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- //--------------------------------------------------------------------------------------
- // LaserPosition is front of projectile, laserVertices[0] is top vertex of bulge.
- // LaserVertices[1] is bottom vertex of bulge, laservertices[2] is back of projectile,
- // and laservertices[3] is the middle of the bulge.
- Stuff::Vector3D lDir(laserDirection);
- lDir *= ((WeaponBoltTypePtr)getObjectType())->bulgeLength;
- laserVertices[0].Add(laserPosition,lDir);
- laserVertices[1] = laserVertices[0];
- laserVertices[3] = laserVertices[0];
-
- laserVertices[1].x += laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[1].y -= laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
-
- laserVertices[0].x -= laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[0].y += laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
-
- laserDirection *= ((WeaponBoltTypePtr)getObjectType())->projLength;
- laserVertices[2].Add(laserPosition,laserDirection);
-
- if (((WeaponBoltTypePtr)getObjectType())->lightSource && !pointLight && (lightId != -1))
- {
- pointLight = ((WeaponBoltTypePtr)getObjectType())->getLight();
- lightId = eye->addWorldLight(pointLight);
- if (lightId == -1)
- {
- //NO LIGHT ALLOWED! TOO Many in World!
- // LightId is now -1 which will cause this to NEVER make a light!
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
- }
- else if (!hitTarget && ((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- //------------------------------------------------
- // For beam we need 4 vertices for the two faces.
- laserVertices[0] = position;
- laserVertices[1] = position;
- laserSide[0] = position;
- laserSide[1] = position;
-
- laserVertices[0].x -= laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[0].y += laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
-
- laserVertices[1].x += laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[1].y -= laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserSide[0].z += ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserSide[1].z -= ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- hsPos = *targetPosition;
- if (target)
- {
- if (!target->isMech())
- {
- hsPos = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hsPos = target->appearance->getHitNodeLeft();
- else
- hsPos = target->appearance->getHitNodeRight();
- }
- }
- //-------------------------------------------
- // Wiggle the hotspot.
- float beamWiggle = ((WeaponBoltTypePtr)getObjectType())->beamWiggle;
- Stuff::Vector3D offset(beamWiggle,beamWiggle,beamWiggle);
- offset.x = RandomNumber(offset.x * 2) - offset.x;
- offset.y = RandomNumber(offset.y * 2) - offset.y;
- offset.z = RandomNumber(offset.z * 2) - offset.z;
- hsPos += offset;
- laserVertices[2] = hsPos;
- laserVertices[3] = hsPos;
-
- laserSide[2] = hsPos;
- laserSide[3] = hsPos;
-
- laserVertices[2].x -= laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[2].y += laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
-
- laserVertices[3].x += laserDirection.y * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserVertices[3].y -= laserDirection.x * ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
-
- laserSide[2].z += ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- laserSide[3].z -= ((WeaponBoltTypePtr)getObjectType())->bulgeWidth;
- }
- if (pointLight)
- {
- Stuff::Point3D ourPosition;
- ourPosition.x = -laserPosition.x;
- ourPosition.y = laserPosition.z;
- ourPosition.z = laserPosition.y;
- pointLight->direction = ourPosition;
- Stuff::LinearMatrix4D lightToWorldMatrix;
- lightToWorldMatrix.BuildTranslation(ourPosition);
- lightToWorldMatrix.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- pointLight->SetLightToWorld(&lightToWorldMatrix);
- pointLight->SetPosition(&laserPosition);
- }
-
- if (hitTarget)
- {
- hitLeft -= frameLength;
-
- if (gosEffect && (hitLeft < 0.0f))
- {
- gosEffect->Kill();
- delete gosEffect;
- gosEffect = NULL;
-
- //Need to kill the light source here too!
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
-
- if (hitEffect && hitEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
-
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- Stuff::OBB boundingBox;
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,&boundingBox);
-
- bool result = hitEffect->Execute(&info);
- if (!result)
- {
- if (hitEffect)
- {
- hitEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete hitEffect;
- hitEffect = NULL;
- }
-
- inView = FALSE;
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
-
- //Kill later to make Steve Happy!!
- if (muzzleEffect)
- {
- muzzleEffect->Kill();
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
- }
- }
- else
- {
- if (hitEffect)
- {
- hitEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete hitEffect;
- hitEffect = NULL;
- }
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
-
- if (missEffect && missEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
-
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- Stuff::OBB boundingBox;
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,&boundingBox);
-
- bool result = missEffect->Execute(&info);
- if (!result)
- {
- if (missEffect)
- {
- missEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete missEffect;
- missEffect = NULL;
- }
-
- //Kill later to make Steve Happy!!
- if (muzzleEffect)
- {
- muzzleEffect->Kill();
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
-
- inView = FALSE;
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
- }
- else
- {
- if (missEffect)
- {
- missEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete missEffect;
- missEffect = NULL;
- }
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
-
- if (waterMissEffect && waterMissEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
-
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = Terrain::waterElevation;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- Stuff::OBB boundingBox;
- gosFX::Effect::ExecuteInfo info((Stuff::Time)scenarioTime,&shapeOrigin,&boundingBox);
-
- bool result = waterMissEffect->Execute(&info);
- if (!result)
- {
- if (waterMissEffect)
- {
- waterMissEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- //Kill later to make Steve Happy!!
- if (muzzleEffect)
- {
- muzzleEffect->Kill();
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
-
- inView = FALSE;
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
- }
- else
- {
- if (waterMissEffect)
- {
- waterMissEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
-
- if (pointLight)
- {
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- }
- if (!waterMissEffect && !hitEffect && !missEffect && !gosEffect)
- inView = false;
- }
-
- return (inView);
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::render (void)
- {
- if (!getFlag(OBJECT_FLAG_JUSTCREATED) && !isTargeted()) //can we be seen by the enemy?
- {
- gosFX::Effect::DrawInfo drawInfo;
- drawInfo.m_clipper = theClipper;
-
- MidLevelRenderer::MLRState mlrState;
- //mlrState.SetBackFaceOn();
- mlrState.SetDitherOn();
- mlrState.SetTextureCorrectionOn();
- mlrState.SetZBufferCompareOn();
- mlrState.SetZBufferWriteOn();
- //mlrState.SetFilterMode(MidLevelRenderer::MLRState::BiLinearFilterMode);
- //mlrState.SetAlphaMode(MidLevelRenderer::MLRState::AlphaInvAlphaMode);
- drawInfo.m_state = mlrState;
- drawInfo.m_clippingFlags = 0x0;
-
- if (!gosEffect && !hitTarget && !((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- //---------------------------
- // Render the polygons here.
- gos_VERTEX lq1Vertices[3], lq2Vertices[3], lq3Vertices[3], lq4Vertices[3];
- Stuff::Vector4D screenPos;
-
- DWORD alphaMode = ((WeaponBoltTypePtr)getObjectType())->boltAlpha;
- alphaMode <<= 24;
-
- DWORD edgeMode = ((WeaponBoltTypePtr)getObjectType())->edgeAlpha;
- edgeMode <<= 24;
-
- eye->projectZ(laserPosition,screenPos);
- lq1Vertices[0].x = screenPos.x;
- lq1Vertices[0].y = screenPos.y;
- lq1Vertices[0].z = 0.1f;
- lq1Vertices[0].rhw = screenPos.w;
- lq1Vertices[0].u = 0.0f;
- lq1Vertices[0].v = 0.0f;
- lq1Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->frontRGB;
-
- lq2Vertices[0].x = screenPos.x;
- lq2Vertices[0].y = screenPos.y;
- lq2Vertices[0].z = 0.1f;
- lq2Vertices[0].rhw = screenPos.w;
- lq2Vertices[0].u = 0.0f;
- lq2Vertices[0].v = 0.0f;
- lq2Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->frontRGB;
-
- eye->projectZ(laserVertices[0],screenPos);
- lq1Vertices[1].x = screenPos.x;
- lq1Vertices[1].y = screenPos.y;
- lq1Vertices[1].z = 0.1f;
- lq1Vertices[1].rhw = screenPos.w;
- lq1Vertices[1].u = 0.0f;
- lq1Vertices[1].v = 0.0f;
- lq1Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- lq3Vertices[1].x = screenPos.x;
- lq3Vertices[1].y = screenPos.y;
- lq3Vertices[1].z = 0.1f;
- lq3Vertices[1].rhw = screenPos.w;
- lq3Vertices[1].u = 0.0f;
- lq3Vertices[1].v = 0.0f;
- lq3Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- eye->projectZ(laserVertices[3],screenPos);
- lq1Vertices[2].x = screenPos.x;
- lq1Vertices[2].y = screenPos.y;
- lq1Vertices[2].z = 0.1f;
- lq1Vertices[2].rhw = screenPos.w;
- lq1Vertices[2].u = 0.0f;
- lq1Vertices[2].v = 0.0f;
- lq1Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- lq2Vertices[2].x = screenPos.x;
- lq2Vertices[2].y = screenPos.y;
- lq2Vertices[2].z = 0.1f;
- lq2Vertices[2].rhw = screenPos.w;
- lq2Vertices[2].u = 0.0f;
- lq2Vertices[2].v = 0.0f;
- lq2Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- lq3Vertices[0].x = screenPos.x;
- lq3Vertices[0].y = screenPos.y;
- lq3Vertices[0].z = 0.1f;
- lq3Vertices[0].rhw = screenPos.w;
- lq3Vertices[0].u = 0.0f;
- lq3Vertices[0].v = 0.0f;
- lq3Vertices[0].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- lq4Vertices[0].x = screenPos.x;
- lq4Vertices[0].y = screenPos.y;
- lq4Vertices[0].z = 0.1f;
- lq4Vertices[0].rhw = screenPos.w;
- lq4Vertices[0].u = 0.0f;
- lq4Vertices[0].v = 0.0f;
- lq4Vertices[0].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- eye->projectZ(laserVertices[2],screenPos);
- lq3Vertices[2].x = screenPos.x;
- lq3Vertices[2].y = screenPos.y;
- lq3Vertices[2].z = 0.1f;
- lq3Vertices[2].rhw = screenPos.w;
- lq3Vertices[2].u = 0.0f;
- lq3Vertices[2].v = 0.0f;
- lq3Vertices[2].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->backRGB;
-
- lq4Vertices[2].x = screenPos.x;
- lq4Vertices[2].y = screenPos.y;
- lq4Vertices[2].z = 0.1f;
- lq4Vertices[2].rhw = screenPos.w;
- lq4Vertices[2].u = 0.0f;
- lq4Vertices[2].v = 0.0f;
- lq4Vertices[2].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->backRGB;
-
- eye->projectZ(laserVertices[1],screenPos);
- lq2Vertices[1].x = screenPos.x;
- lq2Vertices[1].y = screenPos.y;
- lq2Vertices[1].z = 0.1f;
- lq2Vertices[1].rhw = screenPos.w;
- lq2Vertices[1].u = 0.0f;
- lq2Vertices[1].v = 0.0f;
- lq2Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- lq4Vertices[1].x = screenPos.x;
- lq4Vertices[1].y = screenPos.y;
- lq4Vertices[1].z = 0.1f;
- lq4Vertices[1].rhw = screenPos.w;
- lq4Vertices[1].u = 0.0f;
- lq4Vertices[1].v = 0.0f;
- lq4Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- if (((lq1Vertices[0].x > eye->viewMulX) ||
- (lq1Vertices[0].y > eye->viewMulY) ||
- (lq1Vertices[0].x < eye->viewAddX) ||
- (lq1Vertices[0].y < eye->viewAddY) ||
- (lq1Vertices[1].x > eye->viewMulX) ||
- (lq1Vertices[1].y > eye->viewMulY) ||
- (lq1Vertices[1].x < eye->viewAddX) ||
- (lq1Vertices[1].y < eye->viewAddY) ||
- (lq1Vertices[2].x > eye->viewMulX) ||
- (lq1Vertices[2].y > eye->viewMulY) ||
- (lq1Vertices[2].x < eye->viewAddX) ||
- (lq1Vertices[2].y < eye->viewAddY)))
- {
- }
- else
- {
- if (drawOldWay)
- {
- //------------------------
- // Draw em!
- gos_SetRenderState( gos_State_Texture, 0 );
-
- //--------------------------------
- //Set States for Software Renderer
- if (Environment.Renderer == 3)
- {
- gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneZero);
- gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
- gos_SetRenderState( gos_State_MonoEnable, 1);
- gos_SetRenderState( gos_State_Perspective, 0);
- gos_SetRenderState( gos_State_Clipping, 0);
- gos_SetRenderState( gos_State_AlphaTest, 0);
- gos_SetRenderState( gos_State_Specular, 0);
- gos_SetRenderState( gos_State_Dither, 0);
- gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulateAlpha);
- gos_SetRenderState( gos_State_Filter, gos_FilterNone);
- gos_SetRenderState( gos_State_TextureAddress, gos_TextureClamp );
- }
- //--------------------------------
- //Set States for Hardware Renderer
- else
- {
- gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneZero);
- gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
- gos_SetRenderState( gos_State_MonoEnable, 0);
- gos_SetRenderState( gos_State_Perspective, 1);
- gos_SetRenderState( gos_State_Clipping, 2);
- gos_SetRenderState( gos_State_AlphaTest, 0);
- gos_SetRenderState( gos_State_Specular, 0);
- gos_SetRenderState( gos_State_Dither, 1);
- gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulateAlpha);
- gos_SetRenderState( gos_State_Filter, gos_FilterBiLinear);
- gos_SetRenderState( gos_State_TextureAddress, gos_TextureClamp );
- }
- gos_DrawTriangles(lq1Vertices,3);
- }
- else
- {
- mcTextureManager->addVertices(0xffffffff,lq1Vertices,MC2_DRAWALPHA);
- }
- }
-
- if (((lq2Vertices[0].x > eye->viewMulX) ||
- (lq2Vertices[0].y > eye->viewMulY) ||
- (lq2Vertices[0].x < eye->viewAddX) ||
- (lq2Vertices[0].y < eye->viewAddY) ||
- (lq2Vertices[1].x > eye->viewMulX) ||
- (lq2Vertices[1].y > eye->viewMulY) ||
- (lq2Vertices[1].x < eye->viewAddX) ||
- (lq2Vertices[1].y < eye->viewAddY) ||
- (lq2Vertices[2].x > eye->viewMulX) ||
- (lq2Vertices[2].y > eye->viewMulY) ||
- (lq2Vertices[2].x < eye->viewAddX) ||
- (lq2Vertices[2].y < eye->viewAddY)))
- {
- }
- else
- {
- if (drawOldWay)
- {
- gos_DrawTriangles(lq2Vertices,3);
- }
- else
- {
- mcTextureManager->addVertices(0xffffffff,lq2Vertices,MC2_DRAWALPHA);
- }
- }
-
- if (((lq3Vertices[0].x > eye->viewMulX) ||
- (lq3Vertices[0].y > eye->viewMulY) ||
- (lq3Vertices[0].x < eye->viewAddX) ||
- (lq3Vertices[0].y < eye->viewAddY) ||
- (lq3Vertices[1].x > eye->viewMulX) ||
- (lq3Vertices[1].y > eye->viewMulY) ||
- (lq3Vertices[1].x < eye->viewAddX) ||
- (lq3Vertices[1].y < eye->viewAddY) ||
- (lq3Vertices[2].x > eye->viewMulX) ||
- (lq3Vertices[2].y > eye->viewMulY) ||
- (lq3Vertices[2].x < eye->viewAddX) ||
- (lq3Vertices[2].y < eye->viewAddY)))
- {
- }
- else
- {
- if (drawOldWay)
- {
- gos_DrawTriangles(lq3Vertices,3);
- }
- else
- {
- mcTextureManager->addVertices(0xffffffff,lq3Vertices,MC2_DRAWALPHA);
- }
- }
-
- if (((lq4Vertices[0].x > eye->viewMulX) ||
- (lq4Vertices[0].y > eye->viewMulY) ||
- (lq4Vertices[0].x < eye->viewAddX) ||
- (lq4Vertices[0].y < eye->viewAddY) ||
- (lq4Vertices[1].x > eye->viewMulX) ||
- (lq4Vertices[1].y > eye->viewMulY) ||
- (lq4Vertices[1].x < eye->viewAddX) ||
- (lq4Vertices[1].y < eye->viewAddY) ||
- (lq4Vertices[2].x > eye->viewMulX) ||
- (lq4Vertices[2].y > eye->viewMulY) ||
- (lq4Vertices[2].x < eye->viewAddX) ||
- (lq4Vertices[2].y < eye->viewAddY)))
- {
- }
- else
- {
- if (drawOldWay)
- {
- gos_DrawTriangles(lq4Vertices,3);
- }
- else
- {
- mcTextureManager->addVertices(0xffffffff,lq4Vertices,MC2_DRAWALPHA);
- }
- }
- }
- else if (!hitTarget && ((WeaponBoltTypePtr)getObjectType())->isBeam)
- {
- //---------------------------
- // Render the polygons here.
- gos_VERTEX lq1Vertices[3], lq2Vertices[3], lq3Vertices[3], lq4Vertices[3];
- Stuff::Vector4D screenPos;
-
- DWORD alphaMode = ((WeaponBoltTypePtr)getObjectType())->boltAlpha;
- alphaMode <<= 24;
-
- DWORD edgeMode = ((WeaponBoltTypePtr)getObjectType())->edgeAlpha;
- edgeMode <<= 24;
-
- Stuff::Point3D actualPosition;
- Stuff::Vector3D hotSpot = *targetPosition;
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
-
- Stuff::Vector3D length;
- length.Subtract(hotSpot,position);
- float dist = length.GetApproximateLength();
-
- float realUVRepeat = ((WeaponBoltTypePtr)getObjectType())->uvRepeat * dist / ((WeaponBoltTypePtr)getObjectType())->unitLength;
-
- eye->projectZ(laserVertices[0],screenPos);
- lq1Vertices[0].x = screenPos.x;
- lq1Vertices[0].y = screenPos.y;
- lq1Vertices[0].z = screenPos.z;
- lq1Vertices[0].rhw = screenPos.w;
- lq1Vertices[0].u = startUV;
- lq1Vertices[0].v = 0.0f;
- lq1Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- lq2Vertices[0].x = screenPos.x;
- lq2Vertices[0].y = screenPos.y;
- lq2Vertices[0].z = screenPos.z;
- lq2Vertices[0].rhw = screenPos.w;
- lq2Vertices[0].u = startUV;
- lq2Vertices[0].v = 0.0f;
- lq2Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- eye->projectZ(laserVertices[1],screenPos);
- lq2Vertices[1].x = screenPos.x;
- lq2Vertices[1].y = screenPos.y;
- lq2Vertices[1].z = screenPos.z;
- lq2Vertices[1].rhw = screenPos.w;
- lq2Vertices[1].u = startUV;
- lq2Vertices[1].v = 0.999999f;
- lq2Vertices[1].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- eye->projectZ(laserVertices[2],screenPos);
- lq1Vertices[1].x = screenPos.x;
- lq1Vertices[1].y = screenPos.y;
- lq1Vertices[1].z = screenPos.z;
- lq1Vertices[1].rhw = screenPos.w;
- lq1Vertices[1].u = startUV + realUVRepeat;
- lq1Vertices[1].v = 0.0f;
- lq1Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- eye->projectZ(laserVertices[3],screenPos);
- lq1Vertices[2].x = screenPos.x;
- lq1Vertices[2].y = screenPos.y;
- lq1Vertices[2].z = screenPos.z;
- lq1Vertices[2].rhw = screenPos.w;
- lq1Vertices[2].u = startUV + realUVRepeat;
- lq1Vertices[2].v = 0.999999f;
- lq1Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- lq2Vertices[2].x = screenPos.x;
- lq2Vertices[2].y = screenPos.y;
- lq2Vertices[2].z = screenPos.z;
- lq2Vertices[2].rhw = screenPos.w;
- lq2Vertices[2].u = startUV + realUVRepeat;
- lq2Vertices[2].v = 0.999999f;
- lq2Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- eye->projectZ(laserSide[0],screenPos);
- lq3Vertices[0].x = screenPos.x;
- lq3Vertices[0].y = screenPos.y;
- lq3Vertices[0].z = screenPos.z;
- lq3Vertices[0].rhw = screenPos.w;
- lq3Vertices[0].u = startUV;
- lq3Vertices[0].v = 0.0f;
- lq3Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- lq4Vertices[0].x = screenPos.x;
- lq4Vertices[0].y = screenPos.y;
- lq4Vertices[0].z = screenPos.z;
- lq4Vertices[0].rhw = screenPos.w;
- lq4Vertices[0].u = startUV;
- lq4Vertices[0].v = 0.0f;
- lq4Vertices[0].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- eye->projectZ(laserSide[1],screenPos);
- lq4Vertices[1].x = screenPos.x;
- lq4Vertices[1].y = screenPos.y;
- lq4Vertices[1].z = screenPos.z;
- lq4Vertices[1].rhw = screenPos.w;
- lq4Vertices[1].u = startUV;
- lq4Vertices[1].v = 0.999999f;
- lq4Vertices[1].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->midEdgeRGB;
-
- eye->projectZ(laserSide[2],screenPos);
- lq3Vertices[1].x = screenPos.x;
- lq3Vertices[1].y = screenPos.y;
- lq3Vertices[1].z = screenPos.z;
- lq3Vertices[1].rhw = screenPos.w;
- lq3Vertices[1].u = startUV + realUVRepeat;
- lq3Vertices[1].v = 0.0f;
- lq3Vertices[1].argb = edgeMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- eye->projectZ(laserSide[3],screenPos);
- lq3Vertices[2].x = screenPos.x;
- lq3Vertices[2].y = screenPos.y;
- lq3Vertices[2].z = screenPos.z;
- lq3Vertices[2].rhw = screenPos.w;
- lq3Vertices[2].u = startUV + realUVRepeat;
- lq3Vertices[2].v = 0.999999f;
- lq3Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- lq4Vertices[2].x = screenPos.x;
- lq4Vertices[2].y = screenPos.y;
- lq4Vertices[2].z = screenPos.z;
- lq4Vertices[2].rhw = screenPos.w;
- lq4Vertices[2].u = startUV + realUVRepeat;
- lq4Vertices[2].v = 0.999999f;
- lq4Vertices[2].argb = alphaMode + ((WeaponBoltTypePtr)getObjectType())->middleRGB;
-
- if (drawOldWay)
- {
- //------------------------
- // Draw em!
- gos_SetRenderState( gos_State_Texture, 0 );
-
- //--------------------------------
- //Set States for Software Renderer
- if (Environment.Renderer == 3)
- {
- gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneInvAlpha);
- gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
- gos_SetRenderState( gos_State_MonoEnable, 1);
- gos_SetRenderState( gos_State_Perspective, 0);
- gos_SetRenderState( gos_State_Clipping, 1);
- gos_SetRenderState( gos_State_AlphaTest, 0);
- gos_SetRenderState( gos_State_Specular, 0);
- gos_SetRenderState( gos_State_Dither, 0);
- gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulateAlpha);
- gos_SetRenderState( gos_State_Filter, gos_FilterNone);
- gos_SetRenderState( gos_State_TextureAddress, gos_TextureWrap );
- gos_SetRenderState( gos_State_ZCompare, 1);
- gos_SetRenderState( gos_State_ZWrite, 0);
- }
- //--------------------------------
- //Set States for Hardware Renderer
- else
- {
- gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneInvAlpha);
- gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
- gos_SetRenderState( gos_State_MonoEnable, 0);
- gos_SetRenderState( gos_State_Perspective, 1);
- gos_SetRenderState( gos_State_Clipping, 1);
- gos_SetRenderState( gos_State_AlphaTest, 0);
- gos_SetRenderState( gos_State_Specular, 0);
- gos_SetRenderState( gos_State_Dither, 1);
- gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulateAlpha);
- gos_SetRenderState( gos_State_Filter, gos_FilterBiLinear);
- gos_SetRenderState( gos_State_TextureAddress, gos_TextureWrap );
- gos_SetRenderState( gos_State_ZCompare, 1);
- gos_SetRenderState( gos_State_ZWrite, 0);
- }
-
- if (gosTextureHandle != 0xffffffff)
- gos_SetRenderState( gos_State_Texture,gosTextureHandle);
- else
- gos_SetRenderState( gos_State_Texture,0);
- gos_DrawTriangles(lq1Vertices,3);
- gos_DrawTriangles(lq2Vertices,3);
- gos_DrawTriangles(lq3Vertices,3);
- gos_DrawTriangles(lq4Vertices,3);
- }
- else
- {
- if ((lq1Vertices[0].z >= 0.0f) &&
- (lq1Vertices[0].z < 1.0f) &&
- (lq1Vertices[1].z >= 0.0f) &&
- (lq1Vertices[1].z < 1.0f) &&
- (lq1Vertices[2].z >= 0.0f) &&
- (lq1Vertices[2].z < 1.0f))
- {
- mcTextureManager->addVertices(mcTextureHandle,lq1Vertices,MC2_ISEFFECTS|MC2_DRAWONEIN);
- }
-
- if ((lq2Vertices[0].z >= 0.0f) &&
- (lq2Vertices[0].z < 1.0f) &&
- (lq2Vertices[1].z >= 0.0f) &&
- (lq2Vertices[1].z < 1.0f) &&
- (lq2Vertices[2].z >= 0.0f) &&
- (lq2Vertices[2].z < 1.0f))
- {
- mcTextureManager->addVertices(mcTextureHandle,lq2Vertices,MC2_ISEFFECTS|MC2_DRAWONEIN);
- }
-
- if ((lq3Vertices[0].z >= 0.0f) &&
- (lq3Vertices[0].z < 1.0f) &&
- (lq3Vertices[1].z >= 0.0f) &&
- (lq3Vertices[1].z < 1.0f) &&
- (lq3Vertices[2].z >= 0.0f) &&
- (lq3Vertices[2].z < 1.0f))
- {
- mcTextureManager->addVertices(mcTextureHandle,lq3Vertices,MC2_ISEFFECTS|MC2_DRAWONEIN);
- }
-
- if ((lq4Vertices[0].z >= 0.0f) &&
- (lq4Vertices[0].z < 1.0f) &&
- (lq4Vertices[1].z >= 0.0f) &&
- (lq4Vertices[1].z < 1.0f) &&
- (lq4Vertices[2].z >= 0.0f) &&
- (lq4Vertices[2].z < 1.0f))
- {
- mcTextureManager->addVertices(mcTextureHandle,lq4Vertices,MC2_ISEFFECTS|MC2_DRAWONEIN);
- }
- }
-
- if (gosEffect)
- {
- Stuff::Point3D actualPosition;
- Stuff::Vector3D hotSpot = *targetPosition;
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
-
- actualPosition.x = -hotSpot.x; //Play the beam hitting effect at the hit location
- actualPosition.y = hotSpot.z;
- actualPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(actualPosition);
-
- Stuff::UnitQuaternion effectRot;
- effectRot = Stuff::EulerAngles(0.0f,rotation * DEGREES_TO_RADS,0.0f);
- localToWorld.Multiply(gosFX::Effect_Against_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- drawInfo.m_parentToWorld = &localResult;
-
- if (!MLRVertexLimitReached)
- gosEffect->Draw(&drawInfo);
- }
- }
- else if (gosEffect)
- {
- Stuff::Point3D actualPosition;
- actualPosition.x = -laserPosition.x;
- actualPosition.y = laserPosition.z;
- actualPosition.z = laserPosition.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(actualPosition);
-
- Stuff::UnitQuaternion effectRot;
- effectRot = Stuff::EulerAngles(0.0f,rotation * DEGREES_TO_RADS,0.0f);
- localToWorld.Multiply(gosFX::Effect_Against_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- drawInfo.m_parentToWorld = &localResult;
-
- if (!MLRVertexLimitReached)
- gosEffect->Draw(&drawInfo);
- }
-
- if (muzzleEffect)
- {
- Stuff::Point3D mPosition;
- mPosition.x = -position.x;
- mPosition.y = position.z;
- mPosition.z = position.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
- Stuff::LinearMatrix4D localResult;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(mPosition);
-
- GameObjectPtr myOwner = ObjectManager->getByWatchID(ownerWID);
- Stuff::UnitQuaternion effectRot;
-
- if (myOwner)
- effectRot = Stuff::EulerAngles(0.0f, myOwner->getRotation() * DEGREES_TO_RADS,0.0f);
- else
- effectRot = Stuff::EulerAngles(0.0f,0.0f,0.0f);
- localToWorld.Multiply(gosFX::Effect_Into_Motion,effectRot);
- localResult.Multiply(localToWorld,shapeOrigin);
-
- drawInfo.m_parentToWorld = &localResult;
-
- if (!MLRVertexLimitReached)
- muzzleEffect->Draw(&drawInfo);
- }
-
- if (hitEffect && hitTarget && hitEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
- if (target)
- {
- if (!target->isMech())
- {
- hotSpot = target->getPositionFromHS(targetHotSpot);
- }
- else
- {
- if (targetHotSpot)
- hotSpot = target->appearance->getHitNodeLeft();
- else
- hotSpot = target->appearance->getHitNodeRight();
- }
- }
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- drawInfo.m_parentToWorld = &shapeOrigin;
-
- if (!MLRVertexLimitReached)
- hitEffect->Draw(&drawInfo);
- }
-
- if (missEffect && hitTarget && missEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
-
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = hotSpot.z;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- drawInfo.m_parentToWorld = &shapeOrigin;
-
- if (!MLRVertexLimitReached)
- missEffect->Draw(&drawInfo);
- }
-
- if (waterMissEffect && hitTarget && waterMissEffect->IsExecuted())
- {
- Stuff::Vector3D hotSpot = *targetPosition;
-
- Stuff::Point3D tPosition;
- tPosition.x = -hotSpot.x;
- tPosition.y = Terrain::waterElevation;
- tPosition.z = hotSpot.y;
-
- Stuff::LinearMatrix4D shapeOrigin;
- Stuff::LinearMatrix4D localToWorld;
-
- shapeOrigin.BuildRotation(Stuff::EulerAngles(0.0f,0.0f,0.0f));
- shapeOrigin.BuildTranslation(tPosition);
-
- drawInfo.m_parentToWorld = &shapeOrigin;
-
- if (!MLRVertexLimitReached)
- waterMissEffect->Draw(&drawInfo);
- }
- }
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::destroy (void)
- {
- if (targetPosition)
- {
- delete targetPosition;
- targetPosition = NULL;
- }
- //Must toss these here as mission may have ended with effect still playing!!
- if (pointLight)
- {
- if (eye)
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
- if (muzzleEffect)
- {
- muzzleEffect->Kill();
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
- if (gosEffect)
- {
- gosEffect->Kill();
- delete gosEffect;
- gosEffect = NULL;
- }
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::init (bool create, ObjectTypePtr _type)
- {
- GameObject::init(create, _type);
- setFlag(OBJECT_FLAG_JUSTCREATED, true);
- objectClass = WEAPONBOLT;
-
- lightId = -9; //Tell it to make one!
-
- //Make SURE all of the old Effects are GONE!!
- destroy();
- //-----------------------------------------
- // Are we a magical new GOSFX(tm)?
- if (effectId >= 0)
- {
- if (strcmp(weaponEffects->GetEffectName(effectId),"NONE") != 0)
- {
- //--------------------------------------------
- // Yes, load it on up.
- unsigned flags = gosFX::Effect::ExecuteFlag|gosFX::Effect::LoopFlag;
-
- Check_Object(gosFX::EffectLibrary::Instance);
- gosFX::Effect::Specification* gosEffectSpec = gosFX::EffectLibrary::Instance->Find(weaponEffects->GetEffectName(effectId));
-
- if (gosEffectSpec)
- {
- gosEffect = gosFX::EffectLibrary::Instance->MakeEffect(gosEffectSpec->m_effectID, flags);
- gosASSERT(gosEffect != NULL);
-
- MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
-
- //gosEffect->SetScalar(BASE_EFFECT_SCALAR);
- }
- }
-
- if ((strcmp(weaponEffects->GetEffectMuzzleFlashName(effectId),"NONE") != 0) && useNonWeaponEffects)
- {
- //--------------------------------------------
- // Yes, load it on up.
- unsigned flags = gosFX::Effect::ExecuteFlag;
-
- Check_Object(gosFX::EffectLibrary::Instance);
- gosFX::Effect::Specification* gosEffectSpec = gosFX::EffectLibrary::Instance->Find(weaponEffects->GetEffectMuzzleFlashName(effectId));
-
- if (gosEffectSpec)
- {
- muzzleEffect = gosFX::EffectLibrary::Instance->MakeEffect(gosEffectSpec->m_effectID, flags);
- gosASSERT(muzzleEffect != NULL);
-
- MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
-
- //muzzleEffect->SetScalar(BASE_EFFECT_SCALAR);
- }
- }
-
- if (strcmp(weaponEffects->GetEffectHitName(effectId),"NONE") != 0)
- {
- //--------------------------------------------
- // Yes, load it on up.
- unsigned flags = gosFX::Effect::ExecuteFlag;
-
- Check_Object(gosFX::EffectLibrary::Instance);
- gosFX::Effect::Specification* gosEffectSpec = gosFX::EffectLibrary::Instance->Find(weaponEffects->GetEffectHitName(effectId));
-
- if (gosEffectSpec)
- {
- hitEffect = gosFX::EffectLibrary::Instance->MakeEffect(gosEffectSpec->m_effectID, flags);
- gosASSERT(hitEffect != NULL);
-
- MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
-
- //hitEffect->SetScalar(BASE_EFFECT_SCALAR);
- }
- }
-
- if ((strcmp(weaponEffects->GetEffectMissName(effectId),"NONE") != 0) && useNonWeaponEffects)
- {
- //--------------------------------------------
- // Yes, load it on up.
- unsigned flags = gosFX::Effect::ExecuteFlag;
-
- Check_Object(gosFX::EffectLibrary::Instance);
- gosFX::Effect::Specification* gosEffectSpec = gosFX::EffectLibrary::Instance->Find(weaponEffects->GetEffectMissName(effectId));
-
- if (gosEffectSpec)
- {
- missEffect = gosFX::EffectLibrary::Instance->MakeEffect(gosEffectSpec->m_effectID, flags);
- gosASSERT(missEffect != NULL);
-
- MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
-
- //hitEffect->SetScalar(BASE_EFFECT_SCALAR);
- }
- }
-
- //No water miss for machine guns
- if (useNonWeaponEffects && (effectId != 11) && (strcmp(weaponEffects->GetEffectName(WATER_MISS_FX),"NONE") != 0))
- {
- //--------------------------------------------
- // Yes, load it on up.
- unsigned flags = gosFX::Effect::ExecuteFlag;
-
- Check_Object(gosFX::EffectLibrary::Instance);
- gosFX::Effect::Specification* gosEffectSpec = gosFX::EffectLibrary::Instance->Find(weaponEffects->GetEffectName(WATER_MISS_FX));
-
- if (gosEffectSpec)
- {
- waterMissEffect = gosFX::EffectLibrary::Instance->MakeEffect(gosEffectSpec->m_effectID, flags);
- gosASSERT(waterMissEffect != NULL);
-
- MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
-
- //hitEffect->SetScalar(BASE_EFFECT_SCALAR);
- }
- }
- else
- {
- waterMissEffect = NULL;
- }
- }
-
- //----------------------------------------------
- // Get a texture Handle from the textureManager
- // Assume ALPHA!
- if (((WeaponBoltTypePtr)_type)->textureName && stricmp(((WeaponBoltTypePtr)_type)->textureName,"NONE") != 0)
- {
- char tPath[1024];
- sprintf(tPath,"%s128\\",tglPath);
- FullPathFileName textureName;
- textureName.init(tPath,((WeaponBoltTypePtr)_type)->textureName,".tga");
-
- if (((WeaponBoltTypePtr)_type)->mipTexture)
- mcTextureHandle = mcTextureManager->loadTexture(textureName,gos_Texture_Alpha,0);
- else
- mcTextureHandle = mcTextureManager->loadTexture(textureName,gos_Texture_Alpha,gosHint_DisableMipmap);
- }
- else
- {
- mcTextureHandle = 0;
- gosTextureHandle = 0xffffffff;
- }
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::setOwner (GameObjectPtr who)
- {
- if (who)
- ownerWID = who->getWatchID();
- else
- ownerWID = 0;
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::setTarget (GameObjectPtr who)
- {
- if (who)
- targetWID = who->getWatchID();
- else
- targetWID = 0;
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::setTargetPosition (Stuff::Vector3D pos)
- {
- if (!targetPosition)
- targetPosition = new Stuff::Vector3D;
-
- *targetPosition = pos;
- }
- //***************************************************************************
- void WeaponBolt::Save (PacketFilePtr file, long packetNum)
- {
- WeaponBoltData data;
- CopyTo(&data);
- //PacketNum incremented in ObjectManager!!
- file->writePacket(packetNum,(MemoryPtr)&data,sizeof(WeaponBoltData),STORAGE_TYPE_ZLIB);
- }
- //***************************************************************************
- void WeaponBolt::CopyTo (WeaponBoltData *data)
- {
- data->ownerWID = ownerWID;
- data->hotSpotNumber = hotSpotNumber;
- data->targetWID = targetWID;
- data->targetHotSpot = targetHotSpot;
- Stuff::Vector3D dmy;
- dmy.Zero();
- if (targetPosition)
- data->targetPosition = *targetPosition;
- else
- data->targetPosition = dmy;
- data->distanceToTarget = distanceToTarget;
- data->halfDistanceToTarget = halfDistanceToTarget;
- data->weaponShot = weaponShot;
- data->laserPosition = laserPosition;
- memcpy(data->laserVertices,laserVertices,sizeof(Stuff::Vector3D) * 4);
- memcpy(data->laserSide,laserSide,sizeof(Stuff::Vector3D) * 4);
- data->effectId = effectId;
- data->hitTarget = hitTarget;
- data->timeLeft = timeLeft;
- data->hsPos = hsPos;
- data->hitLeft = hitLeft;
- data->mcTextureHandle = mcTextureHandle;
- data->gosTextureHandle = gosTextureHandle;
- data->startUV = startUV;
- data->goalHeight = goalHeight;
- GameObject::CopyTo(dynamic_cast<GameObjectData *>(data));
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::Load (WeaponBoltData *data)
- {
- GameObject::Load(dynamic_cast<GameObjectData *>(data));
- ownerWID = data->ownerWID;
- hotSpotNumber = data->hotSpotNumber;
- targetWID = data->targetWID;
- targetHotSpot = data->targetHotSpot;
- if ((data->targetPosition.x == data->targetPosition.y) &&
- (data->targetPosition.x == data->targetPosition.z))
- targetPosition = NULL;
- else
- {
- targetPosition = new Stuff::Vector3D;
- *targetPosition = data->targetPosition;
- }
- distanceToTarget = data->distanceToTarget;
- halfDistanceToTarget = data->halfDistanceToTarget;
- weaponShot = data->weaponShot;
- laserPosition = data->laserPosition;
- memcpy(laserVertices,data->laserVertices,sizeof(Stuff::Vector3D) * 4);
- memcpy(laserSide,data->laserSide,sizeof(Stuff::Vector3D) * 4);
- effectId = data->effectId;
- hitTarget = data->hitTarget;
- timeLeft = data->timeLeft;
- hsPos = data->hsPos;
- hitLeft = data->hitLeft;
- startUV = data->startUV;
- goalHeight = data->goalHeight;
- }
- //---------------------------------------------------------------------------
- void WeaponBolt::finishNow (void)
- {
- if (getExists())
- {
- //This weapon is still enroute or in some other way is not resolved. Resolve it.
- // Then setExists to false!!
- //Toss its effects.
- if (hitEffect)
- {
- hitEffect->Kill();
- delete hitEffect;
- hitEffect = NULL;
- }
- if (muzzleEffect)
- {
- muzzleEffect->Kill();
- delete muzzleEffect;
- muzzleEffect = NULL;
- }
- if (missEffect)
- {
- missEffect->Kill();
- delete missEffect;
- missEffect = NULL;
- }
- if (waterMissEffect)
- {
- waterMissEffect->Kill();
- delete waterMissEffect;
- waterMissEffect = NULL;
- }
- if (gosEffect)
- {
- gosEffect->Kill(); //Effect is over. Otherwise, wait until hit!
- delete gosEffect;
- gosEffect = NULL;
- }
- //Need to kill the light source here too!
- if (pointLight)
- {
- if (eye)
- eye->removeWorldLight(lightId,pointLight);
- systemHeap->Free(pointLight);
- pointLight = NULL;
- }
- GameObjectPtr target = ObjectManager->getByWatchID(targetWID);
- if (target)
- {
- if (MPlayer)
- {
- if (MPlayer->isServer())
- target->handleWeaponHit(&weaponShot, true);
- }
- else
- target->handleWeaponHit(&weaponShot);
- }
- if (((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectDmg > 0.0f) &&
- (((WeaponBoltTypePtr)getObjectType())->areaEffectRad > 0.0f))
- {
- //Create the explosion here. HIT or MISS, its the same one!!
- // Damage is done by explosion NOT by hit!
- ObjectManager->createExplosion(((WeaponBoltTypePtr)getObjectType())->hitEffectObjNum,
- NULL,*targetPosition,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectDmg,
- ((WeaponBoltTypePtr)getObjectType())->areaEffectRad);
- }
- setExists(false);
- }
- }
- //---------------------------------------------------------------------------
|