Áƒ*žD @Ê KkbG-ràväSMžŸEØÒÆá_Ê NoneClientMessage instanthouse MoronMessageMessageDecosMaxed SavedDecoCoreEngineSystem AlmostIdle LoadingHouseWallGateTriggerThingyCeilingBeginUnrealI PlayerPawnServerSpawnDeco NetworkingbCollideActorsHouseUploadedNadaHouseUploaded FindSlotToLockOrToUnlockHouseUploadFailedTouchTickLocalLoadDecoCARPETShouldHaveWallHouseGenericDecoServerRequestDeco UnrealShare bProjTargetbCollideWorld DrawType SpawnHousebStatic GateClosedCollisionRadiusCollisionHeightAltFire DecorationFirePostBeginPlay BuildWallMotionlessWire2 TakeDamageToggleGateLock RecountHouse KillHouse SetBuildMode CancelLoad SaveHouse HouseHelp LastSpamTimeLastSpamTimeClientLastSpamTimeServerBuildModeStringBM_NoneBM_PlaceGeneric BM_LoadHouseBM_PlaceCarpetBM_RotateWallBM_ExtendWallBM_ExtendCeiling BM_PlaceGate BM_PlaceBedBM_PlaceBenchBM_PlaceStovePawnPutDown Advanced BM_PlaceLamp DeathMessagebBlockPlayers bBlockActorsBM_PlaceTableBringUpTextureIdle BM_NormalbCarpetPickupMessage DrawScalebCollideWhenPlacing RemoteRoleActive StopZoomProcessTraceHitbRoof ItemName HouseZLevels HouseYSize HouseXSizeHouseUploadRateClientInstantFlash ToggleZoom DestroyedTimerServerRemoveDecoServerAddDecoRotatorbMeshEnviroMap RealTableMotionlessWire HouseInfoHouseFloorPorter HouseAmmoEjectAnimatebLockedSetDimensions Rotation AmmoNamePickupAmmoCountMaxAmmo AmmoAmount bMuzzleFlash FireOffset StrPropertyStructPropertyRifle bPushable instigatedByBSValueNetModeWirePawnTeleportEffect ShellCaseNDamage RifleAmmoLamp4ClassProperty TimeSeconds bAltFireRoleOwner bNetInitialClassBedPackage NameProperty citybenchDecoConst RealLamp InstigatorStove TheDecos RepDecosOther RepDecoRots ElTimeroCheckFrequency DeltaTimeTheSlot HitNormal HitLocationGoingUpMyGateLastMessageTime MomentumGenericParentClassXFX cyberFire DefaultFOV DesiredFOVCalcDrawOffset bCanThrow LocationPhysicsbFloor WallWidth WallHeightWallActualHeight WallDepthGenericDecoClassEBuildingMode bNoDelete FireTexture DamageTypeActorMeshLevelInfo InventoryABDYXV BuildingModeRolliYawSObjectProperty DecoClassDecoXDecoYDecoZDecoYaw DecoRoll DecoPitch DecoExtra DecoRecieved LagTimeout DecosPlaced DecoPileEye HouseCenterMoron bLoadLocally SpinnySpinnyGTG ChosenGTGFloatPropertyOrigin ScriptTextDecoLocDecoRot BoolProperty IntProperty ByteProperty ReturnValue TextBufferObjectEnum Function DecoIndexStateYerselfStruct DecoLocX DecoLocY DecoLocZ DecoRotation DecoXtraTempDecoClass DecoLocation bCovered bWealthy bCliffSide MoronString TotalObjectsZNewModeURBSPitch NoMessageDynamicLoadObject TotalDecos LevelInfoGTGDist RepDecoLocsFoundationCenterCurrentLocationCeilingLocationPortalLocationAyeHFPWeapon WhichSideVectorCarpetLocation[‚€‚ ‚Y‚…z‚z>è@@v‡yt C š:¤:$B¹ÿÿÿÿÿÿÿÿÿÿ n‡jóÜP‡jóÜP‚zx2›ˆÒ”õ‡jóÜP‚zx2›ˆÒ”õ‚zx2›†0ÅÊÿ‚zx2›˜Û Íû˜Û Íû‚zx2›˜Û Íû˜Û Íû†0ÅÊÿ„oÓ%S#'$HC($CÓ!Ó…6€@[€…K‡@€j@€¶ZBk ‚š:¤:$-ÏB¹ÿÿÿÿÿÿÿÿÿÿ òv¶Š­GH‚zx2›‚zx2›‚zx2›‚zx2›‚zx2›‚zx2›‚zx2›„"S&…+d‡d€0‘‡!‡?…_ …p€:€g! ,œ8‡aZ !‚š:¤:$-ÏB™ÿÿÿÿÿÿÿÿÿÿ%P-£Ù‡jóÜP„%SUÓ#'$€?($€?Ó"ÓLÓKÓ*…o€‚€‚‘‡…Wd ‘‡1 5-K@@… H…`A‘‡S2C…@ ½xDiÿÿÿÿÿÿÿÿB™ÿÿÿÿÿÿÿÿÿÿ=r:»j½-QìÁ „T$@S!S#j œ7€‡¸E€œ@ €…L@@M@@N@@O@@P@@;@@ €U€œ9‡€‡^d …)‚ ‘‡"‡X.H_d œ \‡r€…b€…ef3H‡B‡k{€@q€‚4€ˆG€F€…Q€…y€az/D€‡ÒWlÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿ2xãYÒ—4 p„u"ÿàõt"ÿàõR€nQMIEDCBA@?>=<;t€€€@ÔL)Óô] €O4ÜT^è‚a! J›:Š:$‰House upload abortedp‰House loading aborted-¨'q! æ›:Š:$‰Not uploading a houseæ‰Not loading a house Â@ð `’M›:Š:$‰*House upload timed out; terminated‰+House loading timed out; terminated-¨'q!  Aú'ax@›:Š:$‰House upload completeg‰House loading complete-¨'q!  ÂBb…H›:Š:$‰%Can't upload; no house saved!t‰#Can't load; no house saved!-¨'q!  ÂC ëc+6Ž:L6K  6Œ:L6L  6:L6M  6¾CDL6N  6·CDL6O  6±CDL6P  {6/  6/  6Ž:6Œ:6:C-6;  )#› %) àI|+£š:¤:$ çpRŠ: Ticking...¸_|¡±_?_ %¡– ,dÂw +*r * a +  W ^— ‚r +*w * a *——‚‚w +*w *"w ² + a a +  W ^¥ ^ €R}„Ch´.˜“â.˜“Ý‹ÞFa ¸.ˆ“!Ø××ד ‹ßÕ?,cÕ®«333@6Œá @bÔr?&OwF*F«@FTmÔ××Õ®«Ãš™™>ÍÌÌ>cÕ®«ÃÍÌL>ÍÌL>bÕ®«Ãš™™>€?r?, g‰a/! þa! Å›:Š:$Currently uploading a saved house, please wait...üCurrently loading a saved house, please wait... +‚rŠ š::$$*©‚‚rŠ š::$  a! /a0 ‡[‘r[“[a¤10q!  *í„rŠx‚‚r“ ›::$ R„„„„„„a/!& š::$&‚š::$ w²)L‚„a/! a/! ±66 ‹F‚‚š::$a/!h ±66 ‹2‚a/! „š::$ š::$ 2‚a/! „š::$ š::$ Jš%ma/!¹6?,"‰ £6·"%6±"%-š::$å„™è#‚›:Š:$ ™,d a à ×#ˆA"*w*’$ØÁš::$y„™è#‚›:Š:$ ™,d a  ×#°A"¾w*’$Øcš::$ „™è#‚›:Š:$ ™,d a Í ×#@B"`w*o‚$’$Øš::$¯„™è#‚›:Š:$ ™,d a Õ ×#°A"w*o‚$.‡-À(’$دš::$g„™è#‚›:Š:$ ™,d a Î ×#ÀA"¬w*’$ØÝ‚š::$a/! „™è#‚›:Š:$ ™,d a ¹ Ø ‹#€A £Úw*’$,a  Ø ‹#€A £,.‡aÚr,*¤Ø% ‚š::$a/! ? „™è#‚›:Š:$ ™,d  ‹ ±º¯6Ž6Ž ‹º¯6Œ6Œ ‹é ±6Ž6Ž ‹6Ž®6Ž ‹«C?, 6ޝ6Ž ‹«C?, e ±6Œ6Œ ‹6Œ®6Œ ‹«C?, 6Œ¯6Œ ‹«C?,a ª " w*a+" a¯C€A-™(-—(a ’$Øe ‚š::$ a/! ‡ „™è#‚›:Š:$ ™,d a ¯ × ‹#¨Ab w*a+"o‚$a'((-´'-™(-—( a × ‹#¨A’$ØŽ ‚š::$  rŠ „™è#‚›:Š:$ ™,d a ¯ ×# @‹ w*a+"o‚$a'((-´'-™(-—(a ×# @’$Øà‚‚š::$a/! Ž £"„™è#‚›:Š:$ ™,d  ‹p±6Ž6Ž ‹6Ž®6Ž ‹C•6ޝ6Ž ‹Câ±6®6 ‹¬C?,6®6C,,°6¯6 ‹¬C?,6¯6Clµ66 ‹6Ž6Ž ‹a ž "Ýw*-™(-—(a ’$Ø‚š::$a/! B„™è#‚›:Š:$ ™,d  ‹ ±6Œ6Œ ‹6Œ®6Œ ‹CÅ6Œ¯6Œ ‹C±6®6 ‹¬C?,6®6C\\°6¯6 ‹¬C?,6¯6Cœµ66 ‹6Œ6Œ ‹a ž "@ w*-™(-—(a ’$Øa‚š::$ a/! r„™è#‚›:Š:$ ™,d  ‹á±6Ž6Ž ‹6Ž®®6Ž ‹¬C?,¬øA?,6ޝ¯6Ž ‹¬C?,¬øA?,r±6Œ6Œ ‹6Œ®®6Œ ‹¬C?,¬øA?,¨6Œ¯¯6Œ ‹¬C?,¬øA?,íŽ £"a ž "@a ž "^w*-™(-—(a ’$ØC‚„a/!&a/! r“áa/! 1. . 4/a0 ,32‚r,“r,.‡1,310. a ž × ‹#€A £ïw*-™(-—( a × ‹#€A’$@w1*+w1*1a¢&1a¢,Ø›š::$ „™è#‚›:Š:$ ™,d ¸6)¼a % "˜w*«)«©)©a)É)¼.%Z)-™(-—(a ’$ØØ‚a/!*r“a¤êw*£**‚a/!*r“a¤ Çv,˜Ÿ;Ç9„°] ×#<š:Š:$] ×#< i¿eT+ »XŒS›:Š:$Currently uploading a saved house, please wait...ŠCurrently loading a saved house, please wait... x//============================================================================= // HouseGenericDeco. //============================================================================= class HouseGenericDeco expands Decoration; var class GenericParentClass; replication { reliable if ( Role == ROLE_Authority && bNetInitial ) GenericParentClass; } X 3퉀S‡„|ë NORMAL|ë HOUSE$‰.Build mode set to Normal (build house)Normal (build house)Qï|ë LOAD$ ‰*Build mode set to Load Saved HouseLoad Saved HouseQN|ë TABLE$‰%Build mode set to Place TablePlace TableQª|ë LAMP$‰$Build mode set to Place LampPlace LampQ |ë STOVE$‰%Build mode set to Place StovePlace StoveQh|ë BENCH$‰%Build mode set to Place BenchPlace BenchQÁ|ë BED$‰#Build mode set to Place BedPlace BedQI„|ë FLOOR|ë CEILING$‰.Build mode set to Extend Ceiling/FloorExtend Ceiling/FloorQÁ„|ë WALL|ë EXTENDWALL$‰%Build mode set to Extend WallExtend WallQk„„|ë ROTATE|ë ROTATEWALL|ë CORNER$ ‰2Build mode set to Rotate Wall (90 degrees)Rotate Wall (90 degrees)QÍ|ë CARPET$ ‰&Build mode set to Place CarpetPlace CarpetQG|ë GATE$‰3Build mode set to Place Gate (shoot a wall)Place Gate (shoot a wall)QÙ„|ë NONE | $ ‰8Build mode set to None (can only delete objects)None (can only delete objects)Q6‡» ‘&r6*6‡»pUnreali.  ‘‚w6*w6©*)6$ ½‚™A% —} %A~ .º‚™A%–’A&}   ’A&Z‰0pBuild mode set to Place Special: pPlace Special: Q‰1ppObject " " not found or invalid Âi//============================================================================= // MotionlessWire2. //============================================================================= class MotionlessWire2 expands MotionlessWire; ÐkwjZ š:¤:$ÿÿÿÿÿÿÿÿÿÿ dÓÞóÐU[¥Ú‡jóÜP‡jóÜP‡jóÜP†0ÅÊÿ‡jóÜP‡jóÜP‡jóÜP†0ÅÊÿ„VÖlc– XIGš:.ˆ“ä%>w.˜“*.˜“Xa( bu2VdŽ›!°¯Š $€? $Š /a0 ‡amlra“aa¤10™-u‰House destroyed ÂGQ ¯oZ„-¨(-8'SŠ >%-i„š:Š:$.‚š:Š:$›:“’:$o'a]G-8SŠ -8(ø„š:Š:$ –>,eå-i>õ>‰?This house is too large to load online; aborting-¨'q! ¡>&l±¯Š S Ax ÿÿÿÿÿÿÿÿÿÿt$fl1lþ!°¯Š $€? $Š /a0 ‡ka`rk“£B10BЂ-lš:Š:$‰3ppObjects recounted; total: SB/1000-l‰2ppObjects recounted; total: SB/100 Âhm)//============================================================================= // HouseInfo. (Not used; a failed method for making giant houses work online.) //============================================================================= class HouseInfo expands Info; #exec OBJ LOAD FILE=..\System\Bed.u #exec OBJ LOAD FILE=..\System\CARPET.u #exec OBJ LOAD FILE=..\System\Ceiling.u #exec OBJ LOAD FILE=..\System\citybench.u #exec OBJ LOAD FILE=..\System\GateClosed.u #exec OBJ LOAD FILE=..\System\RealLamp.u #exec OBJ LOAD FILE=..\System\RealTable.u #exec OBJ LOAD FILE=..\System\Stove.u #exec OBJ LOAD FILE=..\System\Wall.u var Decoration TheDecos[100]; var class RepDecos[100]; var vector RepDecoLocs[100]; var rotator RepDecoRots[100]; var float ElTimero; var int i; const CheckFrequency = 0.5; replication { reliable if ( Role == ROLE_Authority ) RepDecos, RepDecoLocs, RepDecoRots; } simulated function PostBeginPlay() { log(Level.NetMode$": Called PostBeginPlay"); if ( Role < ROLE_Authority ) Enable('Tick'); } simulated function Tick(float DeltaTime) { // only needs to tick on clients if ( Role == ROLE_Authority ) return; log(Level.NetMode$": Ticking..."); ElTimero += DeltaTime; if ( ElTimero > CheckFrequency ) { ElTimero = 0; for ( i = 0; i < 100; i++ ) { // object added if ( RepDecos[i] != None && TheDecos[i] == None ) TheDecos[i] = Spawn(RepDecos[i],,,RepDecoLocs[i],RepDecoRots[i]); else if ( RepDecos[i] == None && TheDecos[i] != None ) { TheDecos[i].Destroy(); TheDecos[i] = None; } else if ( RepDecos[i] != None && TheDecos[i] != None && TheDecos[i].Class != RepDecos[i] ) { TheDecos[i].Destroy(); TheDecos[i] = Spawn(RepDecos[i],,,RepDecoLocs[i],RepDecoRots[i]); } } } } function ServerAddDeco(Decoration D) { local int TheSlot; TheSlot = FindSlot(); if ( TheSlot != -1 ) { TheDecos[TheSlot] = D; RepDecos[TheSlot] = D.Class; RepDecoLocs[TheSlot] = D.Location; RepDecoRots[TheSlot] = D.Rotation; } } function ServerRemoveDeco(Decoration D) { local int TheSlot; TheSlot = FindSlot(D); if ( TheSlot != -1 ) { TheDecos[TheSlot] = None; RepDecos[TheSlot] = None; // don't set the location/rotation to 0; that would waste bandwidth } } simulated function int FindSlot(optional Decoration D) { if ( D == None ) { for ( i = 0; i < 100; i++ ) if ( TheDecos[i] == None ) return i; return -1; } else { for ( i = 0; i < 100; i++ ) if ( TheDecos[i] == D ) return i; return -1; } } ÔG)‚W31“a/!.˜“aaš™™=' iI06’Ü/‰a6 IúC‹Š‚rI“,„r@*°áØI ‹‹j@IjáØ@ ‹‹10©w@*@Ú‰(No nearby controlled gates found Âo31.0p288.0r255.0ÆmVb•”:/a0 ‡V10rV“Va10Æ ]255.0qJ$§›•Q !°¯Š $€? $Š J/a0 ‡TxwrT“Ta¤106Ž&¯¯6ŽJC«C?“.&6Œ&¯¯6ŒJC«C?“-&6&6J6Ž®6Ž&C6Œ®6Œ&C66&%O –52% –2-9%Ü –9.¨-\Ø„™è#‚›:Š:$ ™,dThis house is too big! a ¯ ×# @¨w*£a+"o‚$a'((-´'-™(-—(a ×# @’$?&I˜?,?’9&’2&?/„™ç#‚›:Š:$ ™,cThis house is too big! -?¥?¯w„-`–“5&*¸6*¯C?,Ý„™è#‚›:Š:$ ™,dThis house is too big! a ª *ww*£a+" a¯C€A-™(-—(a *’$—‚-X š%*¹6*?,ý„™è#‚›:Š:$ ™,dThis house is too big! a ª *—w*£a+" a¯C€A-™(-—(a *’$¼ ‚—5& —.&¸6?, ¼ „‚‚š9%š2“-&´?‘,¬??,@‚‚š9“.&š2“-&µ?‘,¬??,¹6Œ¬C?,—%¿„™è#‚›:Š:$ ™,dThis house is too big! #a  "w#*£#-<(#’$k„™è#‚›:Š:$ ™,dThis house is too big! a = Ø#C"w*£-™(-—(a Ø#C’$¸6ŒC¼ –“5&z„™è#‚›:Š:$ ™,dThis house is too big! #a  "Ðw#*£#-<'#’$& „™è#‚›:Š:$ ™,dThis house is too big! a = ×#C"€¼ w*£-™(-—(a ×#C’$¸6Ž«C?,¥9j6Ž®6Ž&C¸6Œ«C?,¥2T6Œ®6Œ&C¸6C¥> v+{—r*a -!-!_-!a'''“‰Gate locked•a(((“‰Gate unlocked =c.ÿÿÿÿÿÿÿÿB™ÿÿÿÿÿÿÿÿÿÿuÇ+¯=r:»j „q:f€³(¢×³(r*a Õ‚(a/!°®g€?Š °‚-!w““(.˜(,This gate is locked; no trespassing!Á -!.˜(?This gate is locked; type 'ToggleGateLock' to unlock itÁi‚-!w““(.˜(*This gate is unlocked; come on in!ÁÁ-!.˜(?This gate is unlocked; type 'ToggleGateLock' to lock itgŠ  \hfƒ ˆHrh* %?– ,d5r * ¥ ÿÿÿÿ† %€– ,dvr h ¥ Oÿÿÿÿ a//============================================================================= // MotionlessWire. //============================================================================= class MotionlessWire expands Wire; Auto State Animate { Begin: // No more idiotic wiggling? } t//============================================================================= // GateTriggerThingy. //============================================================================= class GateTriggerThingy expands Decoration; var Decoration MyGate; var() bool bLocked; var float LastMessageTime; replication { unreliable if ( Role == ROLE_Authority ) bLocked; } function Touch(Actor Other) { Super.Touch(Other); if ( MyGate == None ) { Destroy(); return; } if ( Other.IsA('PlayerPawn') && (LastMessageTime + 1.0) < Level.TimeSeconds ) { if ( bLocked && Owner.Owner != Other ) PlayerPawn(Other).ClientMessage("This gate is locked; no trespassing!"); else if ( bLocked ) PlayerPawn(Other).ClientMessage("This gate is locked; type 'ToggleGateLock' to unlock it"); else if ( !bLocked && Owner.Owner != Other ) PlayerPawn(Other).ClientMessage("This gate is unlocked; come on in!"); else if ( !bLocked ) PlayerPawn(Other).ClientMessage("This gate is unlocked; type 'ToggleGateLock' to lock it"); LastMessageTime = Level.TimeSeconds; } } function ToLockOrToUnlock() { if ( MyGate == None ) { Destroy(); return; } bLocked = !bLocked; if ( bLocked ) { MyGate.SetCollision(True,True,True); Owner.Instigator.ClientMessage("Gate locked"); } else { MyGate.SetCollision(False,False,False); Owner.Instigator.ClientMessage("Gate unlocked"); } } T‡€{€…|€…}€ˆ~€×/%C snp#¬–'šG&"—’n&.'$(”KšG,F˜“n&%'H(”sšG,n—’q&-'p(””šG,’˜“q&%'”( ÓC@W'H ÿÿÿÿÿÿÿÿÿÿ³<'Œ®³'¬'a/!FT-<' a ×' ‹#–C}' a Ø' ‹#HCoa Ú ' ‹oa*' "Ùnô ÿÿÿÿÿÿÿÿÿÿ€As-“;®> s6 ®6s¬C?,pšQ&¸6Ž ®C¬øA?,¹6Œ ¬C?,a ž "@âw*£-™(-—(a ’$¸6Œ Ca ž "@kw*£-™(-—(a ’$ <µšQ,¹6Ž ®C¬øA?,¹6Œ ¬C?,a ž "@'w*£-™(-—(a ’$¸6Œ Ca ž "@°w*£-™(-—(a ’$ <úšQ,¸6Œ ®C¬øA?,¹6Ž ¬C?,a ž "lw*£-™(-—(a ’$¸6Ž Ca ž "õw*£-™(-—(a ’$ <<šQ,¹6Œ ®C¬øA?,¹6Ž ¬C?,a ž "±w*£-™(-—(a ’$¸6Ž Ca ž ":w*£-™(-—(a ’$  €€S61uAö ‰ÎShoot on flat ground to spawn a house to hide in...or a gigantic mansion! Shoot a wall or floor to delete it and make a simple door (or trapdoor), and use the commands below to do many other things.‰---Console Commands---‰ò[ SetDimensions (Length) (Width) (Levels) (T/F) (T/F) (T/F) ]: Sets size of the house and the number of floors. Also sets whether it has a roof and/or carpeted floors and/or a foundation (for houses on uneven, or nonexistent, ground).‰íFor example, "SetDimensions 3 4 5 True False True" would design a house 3 units long, 4 units wide, and 5 levels high, with a roof, no carpets, and a foundation. "1" can be used for "True" and "0" for "False" to save typing time.‰îIf the house requires too many objects (the maximum is 1000 offline and 100 online) or if something else is wrong with the design (such as one dimension being 0), it won't be used, but you will be told what the problem with it is.‰H[ KillHouse ]: Hint-Don't use this when you're on the top floor.‰Ü[ RecountHouse ]: This gun sometimes loses track of how many objects actually exist (if some moron does "Killall Decoration" it will get messed up); use this to re-count them if it thinks you are above the limit.‰d[ SaveHouse ]: Saves your current house (see below). This overwrites the last one you saved.‰8[ SetBuildMode (Mode) ]: Sets what the gun does:‰`"Normal": The default; builds a house. | "Table": Place a table. | "Lamp": Place a lamp.‰Z"Stove": Place a very firey stove. | "Bench": Place a bench. | "Bed": Place a bed.‰`"Floor": Shoot a floor/ceiling to extend it (where you hit it determines the direction).‰h"Wall": Shoot a wall to extend it. | "Rotate": Shoot a wall to add a segment rotated 90 degrees.‰O"Carpet": Shoot the floor to carpet it (shoot the carpet to delete it).‰˜"Gate": Shoot a wall to turn it into a gate; these can be locked or unlocked by typing ToggleGateLock. Shoot it again to replace it with a wall.‰¿"Load": House loading mode; this will place the last house saved with SaveHouse. The house is saved on your own computer, so you can build one offline and use it online or vice versa.‰ÈLoading large houses online will take some time, so be patient! You can't put away or throw the Builder's Rifle while uploading, but you can type "CancelLoad" at any time to cancel the upload.‰d"None": Null mode; can only delete objects. Try setting this and giving this gun to a moron.‰¯(Class name): Use this to add any other available placeable object from its classname (summon code); for example, type "SetBuildMode nalistatue" to place Nali statues.‰ÄThese won't behave like the objects they are based on (WoodenBoxes added in this way aren't pushable or destroyable, for instance), but they look the same and can be saved with your house. Âvå//============================================================================= // InstantHouse: the (more) peaceful version of InstantJail. // Builds you the perfect mansion at the press of a button. // Features: // --Instantly constructs a multileveled house with teleporters // leading between levels // --Width, length, and number of floors are all settable, and // you can also choose to add carpeting, a roof, and a foundation // for houses on cliffsides // --Any part of a house can be deleted simply by shooting it // --Can place several types of furniture, and can load any // decoration available to add to the house // --Walls and ceilings can be extended manually; carpeting can // also be added manually // --Special Gate objects can be placed that can be locked or // unlocked only by you, letting you keep out unwanted visitors and // not get locked out of your house // --Your completed mansion can be saved for later, and can even // be uploaded to any server running this mod // // Type "HouseHelp" ingame while carrying the gun for instructions. // (press "~" after that to see them in your console) // // -------------------------------------------------------------- // // Required files (construction objects and basic furniture): // Bed.u // CARPET.u // Ceiling.u // citybench.u // GateClosed.u // RealLamp.u // RealTable.u // Stove.u // Wall.u // // All of these can be found here: // http://www.freewebs.com/unrealpcube/ // // -------------------------------------------------------------- // // // A rare nonviolent mod by Missileguy // Meshes for objects from []Pcube[]'s "Builder Mod" //============================================================================= class InstantHouse expands Rifle Config(InstantHouse); #exec OBJ LOAD FILE=..\System\Bed.u #exec OBJ LOAD FILE=..\System\CARPET.u #exec OBJ LOAD FILE=..\System\Ceiling.u #exec OBJ LOAD FILE=..\System\citybench.u #exec OBJ LOAD FILE=..\System\GateClosed.u #exec OBJ LOAD FILE=..\System\RealLamp.u #exec OBJ LOAD FILE=..\System\RealTable.u #exec OBJ LOAD FILE=..\System\Stove.u #exec OBJ LOAD FILE=..\System\Wall.u #exec OBJ LOAD FILE=..\Textures\XFX.utx // INCREASE this if things get too laggy online. (Houses will upload slower, though.) // (This is a delay time, so lower = faster, not slower. And faster = laggier.) var(Advanced) float HouseUploadRate; var() int HouseXSize; var() int HouseYSize; var() int HouseZLevels; var() bool bRoof; var() bool bCarpet; var() bool bFloor; const WallWidth=255.0; const WallHeight=255.0; const WallActualHeight=288.0; const WallDepth=31.0; // saved class for "generic" decoration var class GenericDecoClass; var() enum EBuildingMode { BM_Normal, BM_PlaceTable, BM_PlaceLamp, BM_PlaceStove, BM_PlaceBench, BM_PlaceBed, BM_PlaceGate, BM_ExtendCeiling, BM_ExtendWall, BM_RotateWall, BM_PlaceCarpet, BM_LoadHouse, BM_PlaceGeneric, BM_None, } BuildingMode; var() string BuildModeString; var(Networking) float LastSpamTimeServer; var(Networking) float LastSpamTimeClient; var(Networking) float LastSpamTime; // house saving system // New version using strings to bypass the idiot 85-entries limit. struct SavedDeco { var() config String DecoClass; var() config String DecoX; var() config String DecoY; var() config String DecoZ; var() config String DecoYaw; var() config String DecoRoll; var() config String DecoPitch; var() config bool DecoExtra; }; var bool DecoRecieved; var float LagTimeout; var int DecosPlaced; var() config SavedDeco DecoPile[1000]; var int Eye; var vector HouseCenter; var float Moron; var bool bLoadLocally; replication { reliable if ( Role < ROLE_Authority ) SetDimensions, SetBuildMode, HouseHelp, KillHouse, RecountHouse, ToggleGateLock, ServerSpawnDeco, MoronMessage, HouseUploaded, HouseUploadedNada, CancelLoad; reliable if ( Role == ROLE_Authority ) ServerRequestDeco, HouseCenter; } /* function Tick(float DeltaTime) { Super.Tick(DeltaTime); Moron += DeltaTime; if ( Moron > 1.0 ) { Moron = 0; MoronMessage("Deco count: "$DecosPlaced); } } */ function PostBeginPlay() { Super.PostBeginPlay(); if ( HouseUploadRate < 0.01 || Level.NetMode == NM_StandAlone ) HouseUploadRate = 0.01; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local shellcase s; local vector V; local Actor A; local Decoration D; local Rotator SpinnySpinny; local GateTriggerThingy GTG, ChosenGTG; if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.4, vect(650, 450, 190)); if ( PlayerPawn(Owner).DesiredFOV == PlayerPawn(Owner).DefaultFOV ) bMuzzleFlash++; } s = Spawn(class'ShellCase',Pawn(Owner), '', Owner.Location + CalcDrawOffset() + 30 * X + (2.8 * FireOffset.Y+5.0) * Y - Z * 1); if ( s != None ) { s.DrawScale = 2.0; s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.2+0.2)*Y + (FRand()*0.3+1.0) * Z)*160); } if ( !Instigator.IsA('PlayerPawn') ) return; // should never happen, but uh... if ( IsInState('LoadingHouse') ) { if ( Level.NetMode != NM_StandAlone ) MoronMessage("Currently uploading a saved house, please wait..."); else MoronMessage("Currently loading a saved house, please wait..."); return; } if ( Other == Level && BuildingMode == BM_Normal ) { SpawnHouse( HitLocation ); } else if ( Other == Level && BuildingMode == BM_LoadHouse && !IsInState('LoadingHouse') ) { // kill old house (LoadHouse gets sent to the client so he can load his own house and // send it to the server) foreach AllActors( class'Decoration', D ) { if ( D.Owner == Self ) { D.Destroy(); --DecosPlaced; } } HouseCenter = HitLocation; GoToState('LoadingHouse'); //LoadHouse( HitLocation ); return; } else if ( Other == Level || (Other.Owner == Self && BuildingMode != BM_None && (Other.IsA('GateClosed') || BuildingMode == BM_PlaceGate || (BuildingMode == BM_PlaceGeneric && Other.Class != GenericDecoClass) || ((Other.IsA('Ceiling') || Other.IsA('CARPET')) && HitLocation.Z > Other.Location.Z) || (BuildingMode == BM_PlaceLamp && Other.IsA('RealTable') && HitLocation.Z > Other.Location.Z) || (Other.IsA('Wall') && (BuildingMode == BM_ExtendWall || BuildingMode == BM_RotateWall)) || (Other.IsA('Ceiling') && (BuildingMode == BM_ExtendCeiling || BuildingMode == BM_PlaceCarpet)))) ) { // prevent saving error due to the HouseCenter not being set // because you haven't actually placed a house if ( DecosPlaced == 0 ) HouseCenter = HitLocation; // don't place stuff on top of carpets if ( Other.IsA('Carpet') ) HitLocation.Z -= 5; SpinnySpinny = Instigator.Rotation; SpinnySpinny.Roll = 0; SpinnySpinny.Pitch = 0; if ( BuildingMode == BM_PlaceTable ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'RealTable.RealTable', self,, (HitLocation+vect(0,0,17)), SpinnySpinny); if ( A != None ) A.RemoteRole = ROLE_SimulatedProxy; } else if ( BuildingMode == BM_PlaceLamp ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'RealLamp.RealLamp', self,, (HitLocation+vect(0,0,22)), SpinnySpinny); if ( A != None ) A.RemoteRole = ROLE_SimulatedProxy; } else if ( BuildingMode == BM_PlaceStove ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'Stove.Stove', self,, (HitLocation+vect(0,0,48)), SpinnySpinny); if ( A != None ) { A.SetPhysics(PHYS_None); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_PlaceBench ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'citybench.citybench', self,, (HitLocation+vect(0,0,22)), SpinnySpinny); if ( A != None ) { A.SetPhysics(PHYS_None); Decoration(A).bPushable = False; A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_PlaceBed ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'Bed.Bed', self,, (HitLocation+vect(0,0,24)), SpinnySpinny); if ( A != None ) A.RemoteRole = ROLE_SimulatedProxy; } else if ( BuildingMode == BM_PlaceGate && Other.IsA('Wall') ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'GateClosed.GateClosed', self,, (Other.Location-vect(0,0,16)), Other.Rotation); if ( A != None ) { A.RemoteRole = ROLE_SimulatedProxy; GTG = Spawn(class'GateTriggerThingy', self,, (Other.Location-vect(0,0,16)), Other.Rotation); GTG.MyGate = Decoration(A); Other.Destroy(); if ( GTG == None ) --DecosPlaced; } } else if ( BuildingMode == BM_ExtendCeiling && Other.IsA('Ceiling') ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } V = Other.Location; if ( Abs(HitLocation.X - Other.Location.X) > Abs(HitLocation.Y - Other.Location.Y) ) { if ( HitLocation.X > Other.Location.X ) V.X = Other.Location.X + (WallWidth*2); else V.X = Other.Location.X - (WallWidth*2); } else { if ( HitLocation.Y > Other.Location.Y ) V.Y = Other.Location.Y + (WallWidth*2); else V.Y = Other.Location.Y - (WallWidth*2); } A = Spawn(class'Ceiling.Ceiling', self,, V); if ( A != None ) { A.SetRotation(rot(0,0,0)); A.SetCollisionSize(350.0,16.0); A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(V); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_PlaceCarpet && Other.IsA('Ceiling') ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'CARPET.CARPET', self,, (Other.Location+vect(0,0,21))); if ( A != None ) { A.SetRotation(rot(0,0,0)); A.SetPhysics(PHYS_None); A.SetCollision(True,False,False); A.bProjTarget = True; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(Other.Location+vect(0,0,21)); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_PlaceCarpet && Other == Level ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } A = Spawn(class'CARPET.CARPET', self,, (HitLocation+vect(0,0,5))); if ( A != None ) { A.SetRotation(rot(0,0,0)); A.SetPhysics(PHYS_None); A.SetCollision(True,False,False); A.bProjTarget = True; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(HitLocation+vect(0,0,5)); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_ExtendWall && Other.IsA('Wall') && Other.Rotation == rot(0,0,0) ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } V = Other.Location; if ( HitLocation.X > Other.Location.X ) V.X = Other.Location.X + WallWidth; else V.X = Other.Location.X - WallWidth; if ( HitLocation.Z > Other.Location.Z + (WallActualHeight/4) ) V.Z = V.Z + WallHeight; else if ( HitLocation.Z < Other.Location.Z - (WallActualHeight/4) ) V.Z = V.Z - WallHeight; if ( V.Z != Other.Location.Z ) V.X = Other.Location.X; A = Spawn(class'Wall.Wall', self,, V, rot(0,0,0)); if ( A != None ) { A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(V); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_ExtendWall && Other.IsA('Wall') ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } V = Other.Location; if ( HitLocation.Y > Other.Location.Y ) V.Y = Other.Location.Y + WallWidth; else V.Y = Other.Location.Y - WallWidth; if ( HitLocation.Z > Other.Location.Z + (WallActualHeight/4) ) V.Z = V.Z + WallHeight; else if ( HitLocation.Z < Other.Location.Z - (WallActualHeight/4) ) V.Z = V.Z - WallHeight; if ( V.Z != Other.Location.Z ) V.Y = Other.Location.Y; A = Spawn(class'Wall.Wall', self,, V, rot(0,16384,0)); if ( A != None ) { A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(V); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( BuildingMode == BM_RotateWall && Other.IsA('Wall') ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } V = Other.Location; if ( HitLocation.X > Other.Location.X ) V.X = Other.Location.X + (WallWidth/2) + (WallDepth/2); else V.X = Other.Location.X - (WallWidth/2) - (WallDepth/2); if ( HitLocation.Y > Other.Location.Y ) V.Y = Other.Location.Y + (WallWidth/2) + (WallDepth/2); else V.Y = Other.Location.Y - (WallWidth/2) - (WallDepth/2); if ( Other.Rotation == rot(0,0,0) ) A = Spawn(class'Wall.Wall', self,, V, rot(0,16384,0)); else A = Spawn(class'Wall.Wall', self,, V, rot(0,0,0)); if ( A != None ) { A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(V); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( (Other.IsA('GateClosed') || Other.IsA('GateTriggerThingy')) && Other.Owner == Self ) { if ( Other.IsA('GateTriggerThingy') ) { ChosenGTG = GateTriggerThingy(Other); Other = GateTriggerThingy(Other).MyGate; } else { foreach AllActors(class'GateTriggerThingy', GTG) { if ( GTG.Owner == Self && GTG.MyGate == Decoration(Other) ) { ChosenGTG = GTG; break; } } } Other = GateTriggerThingy(Other).MyGate; A = Spawn(class'Wall.Wall', self,, (Other.Location+vect(0,0,16)), Other.Rotation); if ( A != None ) { A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation((Other.Location+vect(0,0,16))); A.RemoteRole = ROLE_SimulatedProxy; } if ( ChosenGTG != None ) { if ( ChosenGTG.MyGate != None ) { ChosenGTG.MyGate.Destroy(); DecosPlaced -= 1; } ChosenGTG.Destroy(); DecosPlaced -= 2; } } else if ( BuildingMode == BM_PlaceGeneric ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MessageDecosMaxed(); return; } V = HitLocation; V.Z += GenericDecoClass.Default.CollisionHeight; A = Spawn(class'HouseGenericDeco', self,, V, SpinnySpinny); if ( A != None ) { A.DrawScale = GenericDecoClass.Default.DrawScale; A.Mesh = GenericDecoClass.Default.Mesh; A.SetCollisionSize(GenericDecoClass.Default.CollisionRadius,GenericDecoClass.Default.CollisionHeight); HouseGenericDeco(A).GenericParentClass = GenericDecoClass; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(V); A.RemoteRole = ROLE_SimulatedProxy; } } else if ( Other.IsA('Decoration') && Other.Owner == Self ) { Other.Destroy(); --DecosPlaced; } if ( A != None ) ++DecosPlaced; } else if ( Other.IsA('Decoration') && Other.Owner == Self ) { Other.Destroy(); --DecosPlaced; } } function MessageDecosMaxed() { Instigator.ClientMessage("Can't place any more objects; delete something!"); } function BringUp() { Super.BringUp(); Instigator.ClientMessage("Builder's Rifle selected; type \"HouseHelp\" for instructions"); Instigator.ClientMessage("Build mode: "$BuildModeString); if ( Level.NetMode == NM_StandAlone ) Instigator.ClientMessage("Objects placed: "$DecosPlaced$"/1000"); else Instigator.ClientMessage("Objects placed: "$DecosPlaced$"/100"); } simulated exec function HouseHelp() { Instigator.ClientMessage("Shoot on flat ground to spawn a house to hide in...or a gigantic mansion! Shoot a wall or floor to delete it and make a simple door (or trapdoor), and use the commands below to do many other things."); Instigator.ClientMessage("---Console Commands---"); Instigator.ClientMessage("[ SetDimensions (Length) (Width) (Levels) (T/F) (T/F) (T/F) ]: Sets size of the house and the number of floors. Also sets whether it has a roof and/or carpeted floors and/or a foundation (for houses on uneven, or nonexistent, ground)."); Instigator.ClientMessage("For example, \"SetDimensions 3 4 5 True False True\" would design a house 3 units long, 4 units wide, and 5 levels high, with a roof, no carpets, and a foundation. \"1\" can be used for \"True\" and \"0\" for \"False\" to save typing time."); Instigator.ClientMessage("If the house requires too many objects (the maximum is 1000 offline and 100 online) or if something else is wrong with the design (such as one dimension being 0), it won't be used, but you will be told what the problem with it is."); Instigator.ClientMessage("[ KillHouse ]: Hint-Don't use this when you're on the top floor."); Instigator.ClientMessage("[ RecountHouse ]: This gun sometimes loses track of how many objects actually exist (if some moron does \"Killall Decoration\" it will get messed up); use this to re-count them if it thinks you are above the limit."); Instigator.ClientMessage("[ SaveHouse ]: Saves your current house (see below). This overwrites the last one you saved."); Instigator.ClientMessage("[ SetBuildMode (Mode) ]: Sets what the gun does:"); Instigator.ClientMessage("\"Normal\": The default; builds a house. | \"Table\": Place a table. | \"Lamp\": Place a lamp."); Instigator.ClientMessage("\"Stove\": Place a very firey stove. | \"Bench\": Place a bench. | \"Bed\": Place a bed."); Instigator.ClientMessage("\"Floor\": Shoot a floor/ceiling to extend it (where you hit it determines the direction)."); Instigator.ClientMessage("\"Wall\": Shoot a wall to extend it. | \"Rotate\": Shoot a wall to add a segment rotated 90 degrees."); Instigator.ClientMessage("\"Carpet\": Shoot the floor to carpet it (shoot the carpet to delete it)."); Instigator.ClientMessage("\"Gate\": Shoot a wall to turn it into a gate; these can be locked or unlocked by typing ToggleGateLock. Shoot it again to replace it with a wall."); Instigator.ClientMessage("\"Load\": House loading mode; this will place the last house saved with SaveHouse. The house is saved on your own computer, so you can build one offline and use it online or vice versa."); Instigator.ClientMessage("Loading large houses online will take some time, so be patient! You can't put away or throw the Builder's Rifle while uploading, but you can type \"CancelLoad\" at any time to cancel the upload."); Instigator.ClientMessage("\"None\": Null mode; can only delete objects. Try setting this and giving this gun to a moron."); Instigator.ClientMessage("(Class name): Use this to add any other available placeable object from its classname (summon code); for example, type \"SetBuildMode nalistatue\" to place Nali statues."); Instigator.ClientMessage("These won't behave like the objects they are based on (WoodenBoxes added in this way aren't pushable or destroyable, for instance), but they look the same and can be saved with your house."); } // Do NOT replicate this function! It must only be called on the client // with the weapon, otherwise it will overwrite everyone else's houses, too! simulated exec function SaveHouse() { local Decoration Deco; local int i; local vector DecoLoc; local rotator DecoRot; if ( Level.TimeSeconds - LastSpamTime < 1.0 ) return; LastSpamTime = Level.TimeSeconds; for ( i = 0; i < 1000; i++ ) { DecoPile[i].DecoClass = ""; DecoPile[i].DecoX = ""; DecoPile[i].DecoY = ""; DecoPile[i].DecoZ = ""; DecoPile[i].DecoYaw = ""; DecoPile[i].DecoPitch = ""; DecoPile[i].DecoRoll = ""; DecoPile[i].DecoExtra = False; } i = 0; foreach AllActors(class'Decoration', Deco) { if ( Deco.Owner == Self && GateClosed(Deco) == None ) //Gates are saved using the GateTriggerThingy { DecoPile[i].DecoX = String(Deco.Location.X - HouseCenter.X); DecoPile[i].DecoY = String(Deco.Location.Y - HouseCenter.Y); DecoPile[i].DecoZ = String(Deco.Location.Z - HouseCenter.Z); DecoPile[i].DecoYaw = String(Deco.Rotation.Yaw); DecoPile[i].DecoPitch = String(Deco.Rotation.Pitch); DecoPile[i].DecoRoll = String(Deco.Rotation.Roll); if ( !Deco.IsA('HouseGenericDeco') ) DecoPile[i].DecoClass = String(Deco.Class); else DecoPile[i].DecoClass = String(HouseGenericDeco(Deco).GenericParentClass); if ( (HouseFloorPorter(Deco) != None && HouseFloorPorter(Deco).GoingUp) || (GateTriggerThingy(Deco) != None && GateTriggerThingy(Deco).bLocked) ) DecoPile[i].DecoExtra = True; else DecoPile[i].DecoExtra = False; i += 1; } } if ( i != 0 ) { SaveConfig(); MoronMessage("House saved"); if ( i > 100 ) MoronMessage("Warning: this house cannot be completely loaded online!"); } else MoronMessage("Can't save; you haven't placed any objects yet!"); } simulated function MoronMessage(String S) { Instigator.ClientMessage(S); } // Sends data with some delay to give the server time to accept it without lagging out everything else (hopefully). // For some idiot reason simulated states don't seem to work in Unreal, so this has to be done on the server... state LoadingHouse { function AltFire(float Value) { if ( Owner.IsA('PlayerPawn') ) { PlayerPawn(Owner).ToggleZoom(); SetTimer(0.075,True); } } function Timer() { if (Pawn(Owner).bAltFire == 0) { if (PlayerPawn(Owner) != None) PlayerPawn(Owner).StopZoom(); SetTimer(0.0,False); } } function Fire(float Value) { if ( Level.NetMode != NM_StandAlone ) MoronMessage("Currently uploading a saved house, please wait..."); else MoronMessage("Currently loading a saved house, please wait..."); } function bool PutDown() { if ( Level.NetMode != NM_StandAlone ) MoronMessage("Currently uploading a saved house, please wait..."); else MoronMessage("Currently loading a saved house, please wait..."); return False; } Begin: //MoronMessage(Self$", "$Level.NetMode$": Starting LoadingHouse"); bCanThrow = False; DecoRecieved = True; LagTimeout = Level.TimeSeconds; Eye = 0; bLoadLocally = ( Level.NetMode == NM_StandAlone || (Level.NetMode == NM_ListenServer && Owner.RemoteRole != ROLE_AutonomousProxy) ); while ( true ) { Sleep(HouseUploadRate); if ( DecoRecieved ) { LagTimeout = Level.TimeSeconds; DecoRecieved = False; if ( Level.NetMode == NM_StandAlone || Eye < 101 ) { if ( bLoadLocally ) LocalLoadDeco( Eye ); else ServerRequestDeco( Eye, Instigator ); } else { MoronMessage("This house is too large to load online; aborting"); bCanThrow = True; GoToState('AlmostIdle'); } Eye += 1; } if ( Level.TimeSeconds - LagTimeout > 10.0 ) HouseUploadFailed(); } } state AlmostIdle { ignores Fire, AltFire; Begin: sleep(1.0); GoToState('Idle'); } simulated exec function CancelLoad() { if ( IsInState('LoadingHouse') ) { if ( Level.NetMode != NM_StandAlone ) Instigator.ClientMessage("House upload aborted"); else Instigator.ClientMessage("House loading aborted"); bCanThrow = True; GoToState('AlmostIdle'); } else { if ( Level.NetMode != NM_StandAlone ) Instigator.ClientMessage("Not uploading a house"); else Instigator.ClientMessage("Not loading a house"); } } function HouseUploadFailed() { if ( Level.NetMode != NM_StandAlone ) Instigator.ClientMessage("House upload timed out; terminated"); else Instigator.ClientMessage("House loading timed out; terminated"); bCanThrow = True; GoToState('AlmostIdle'); } function HouseUploaded() { if ( Level.NetMode != NM_StandAlone ) Instigator.ClientMessage("House upload complete"); else Instigator.ClientMessage("House loading complete"); bCanThrow = True; GoToState('AlmostIdle'); } function HouseUploadedNada() { if ( Level.NetMode != NM_StandAlone ) Instigator.ClientMessage("Can't upload; no house saved!"); else Instigator.ClientMessage("Can't load; no house saved!"); bCanThrow = True; GoToState('AlmostIdle'); } // This is called only offline and on Listen servers when the host "uploads" a house. function LocalLoadDeco( int DecoIndex ) { local vector DecoLoc; local rotator DecoRot; //MoronMessage(Level.NetMode$": LocalLoadDeco "$DecoIndex); DecoLoc.X = float(DecoPile[DecoIndex].DecoX); DecoLoc.Y = float(DecoPile[DecoIndex].DecoY); DecoLoc.Z = float(DecoPile[DecoIndex].DecoZ); DecoRot.Yaw = float(DecoPile[DecoIndex].DecoYaw); DecoRot.Roll = float(DecoPile[DecoIndex].DecoRoll); DecoRot.Pitch = float(DecoPile[DecoIndex].DecoPitch); if ( DecoPile[DecoIndex].DecoClass != "" ) ServerSpawnDeco(DecoPile[DecoIndex].DecoClass, DecoLoc.X, DecoLoc.Y, DecoLoc.Z, DecoRot, DecoPile[DecoIndex].DecoExtra); else if ( DecoIndex != 0 ) HouseUploaded(); else HouseUploadedNada(); } // Called on clients; sends the server information about a saved decoration. simulated function ServerRequestDeco( int DecoIndex, pawn Yerself ) { local vector DecoLoc; local rotator DecoRot; //MoronMessage(Level.NetMode$": ServerRequestDeco "$DecoIndex); // bNetOwner doesn't seem to work, so in case this function is sent to the wrong person... if ( Level.NetMode == NM_DedicatedServer || Yerself == None || Yerself.Role != ROLE_AutonomousProxy ) return; DecoLoc.X = float(DecoPile[DecoIndex].DecoX); DecoLoc.Y = float(DecoPile[DecoIndex].DecoY); DecoLoc.Z = float(DecoPile[DecoIndex].DecoZ); DecoRot.Yaw = float(DecoPile[DecoIndex].DecoYaw); DecoRot.Roll = float(DecoPile[DecoIndex].DecoRoll); DecoRot.Pitch = float(DecoPile[DecoIndex].DecoPitch); if ( DecoPile[DecoIndex].DecoClass != "" ) ServerSpawnDeco(DecoPile[DecoIndex].DecoClass, DecoLoc.X, DecoLoc.Y, DecoLoc.Z, DecoRot, DecoPile[DecoIndex].DecoExtra); else if ( DecoIndex != 0 ) HouseUploaded(); else HouseUploadedNada(); } // Spawns a decoration sent by a client. The location vector is sent in individual floats to prevent // data loss due to "quantizing" of vectors. (This doesn't seem to actually be happening, but if it // isn't it shouldn't matter because the same amount of data is being sent...and if it is happening, // houses should get saved better online.) Not much point in deconstructing the Rotator, though...who // will notice if a rotated object is turned 0.01 degrees too far?! simulated function ServerSpawnDeco( String DecoClass, float DecoLocX, float DecoLocY, float DecoLocZ, rotator DecoRotation, bool DecoXtra ) { local Actor A, B; local class TempDecoClass; local vector DecoLocation; //MoronMessage("Revieving decoration, class = "$DecoClass); if ( DecoClass == "" ) { log(Self$": Null object recieved"); DecoRecieved = True; return; } DecoLocation.X = DecoLocX; DecoLocation.Y = DecoLocY; DecoLocation.Z = DecoLocZ; TempDecoClass = (Class(DynamicLoadObject(DecoClass, class'Class'))); if ( !TempDecoClass.Default.bStatic && !TempDecoClass.Default.bNoDelete ) A = Spawn(TempDecoClass, self,, (HouseCenter+DecoLocation), DecoRotation); // spawn a "generic" decoration, or do the ultimate "FU" to cheaters by turning their PrismTower // or whatever else they tried to sneak in into a useless decoration. if ( (A != None || TempDecoClass.Default.bStatic || TempDecoClass.Default.bNoDelete) && TempDecoClass.Default.Mesh != None && (Wall(A) == None && Bed(A) == None && citybench(A) == None && CARPET(A) == None && Ceiling(A) == None && GateClosed(A) == None && RealTable(A) == None && RealLamp(A) == None && Stove(A) == None && GateTriggerThingy(A) == None && HouseFloorPorter(A) == None && MotionlessWire(A) == None) ) { A.Destroy(); A = Spawn(class'HouseGenericDeco', self,, (HouseCenter+DecoLocation), DecoRotation); if ( A != None ) { A.DrawScale = TempDecoClass.Default.DrawScale; A.Mesh = TempDecoClass.Default.Mesh; A.SetCollisionSize(TempDecoClass.Default.CollisionRadius,TempDecoClass.Default.CollisionHeight); HouseGenericDeco(A).GenericParentClass = TempDecoClass; } } if ( Decoration(A) == None ) { if ( A != None ) A.Destroy(); DecoRecieved = True; return; } Decoration(A).bPushable = False; if ( A.Physics == PHYS_Falling ) A.SetPhysics(PHYS_None); if ( Ceiling(A) != None ) A.SetCollisionSize(350.0,16.0); if ( HouseFloorPorter(A) != None ) HouseFloorPorter(A).GoingUp = DecoXtra; if ( GateTriggerThingy(A) != None ) { B = Spawn(class'GateClosed.GateClosed', self,, (HouseCenter+DecoLocation), DecoRotation); GateTriggerThingy(A).bLocked = DecoXtra; if ( !DecoXtra ) B.SetCollision(False,False,False); GateTriggerThingy(A).MyGate = Decoration(B); ++DecosPlaced; } A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(HouseCenter+DecoLocation); if ( Carpet(A) != None ) { A.bProjTarget = True; A.SetCollision(True,False,False); } if ( A != None ) { ++DecosPlaced; A.RemoteRole = ROLE_SimulatedProxy; } DecoRecieved = True; } simulated exec function SetDimensions( int X, int Y, int Z, optional bool bCovered, optional bool bWealthy, optional bool bCliffSide ) { local bool bS; local string MoronString; local int TotalObjects; if ( (X > 0 && Z == 1) || X > 1 ) HouseXSize = X; else bS = True; if ( Y > 0 && !bS ) HouseYSize = Y; else bS = True; if ( Z > 0 && !bS ) HouseZLevels = Z; else bS = True; if ( bS ) { Instigator.ClientMessage("Length, Width, and Height must be greater than 0. Length must also be at least 2 if Height is greater than 1, to allow space for the teleporters."); return; } bRoof = bCovered; bCarpet = bWealthy; bFloor = bCliffSide; // floors TotalObjects = (Y*X)*(Z-1); // walls (sides) if ( (X == 1 && Y != 1) || (X != 1 && Y == 1) ) // linear TotalObjects += (((Y*X)-2)*4*Z); else if ( X != 1 || Y != 1 ) // box TotalObjects += (((Y*X)-4)*2*Z); // walls (corners) if ( (X == 1 && Y != 1) || (X != 1 && Y == 1) ) // linear TotalObjects += (12*Z); else if ( X != 1 || Y != 1 ) // box TotalObjects += (16*Z); else TotalObjects += (8*Z); // one square // carpets/roof/floor if ( bWealthy ) TotalObjects += ((Y*X)*Z); if ( bCovered ) TotalObjects += (Y*X); if ( bCliffSide ) TotalObjects += (Y*X); // teleporters if ( z > 1 ) TotalObjects += 4; // first floor/top floor if ( z > 2 ) TotalObjects += (4*(Z-2)); // too many objects? if ( TotalObjects > 1000 ) { Instigator.ClientMessage("This house would require "$TotalObjects$" objects; the maximum is 1000"); return; } else if ( TotalObjects > 100 && Level.Netmode != NM_StandAlone ) { Instigator.ClientMessage("This house would require "$TotalObjects$" objects; the maximum for online games is 100"); return; } MoronString = "New dimensions: "$HouseXSize$" unit(s) long, "$HouseYSize$" unit(s) wide, "$HouseZLevels$" level(s) high, "; if ( bRoof ) MoronString = MoronString $ "has roof, "; else MoronString = MoronString $ "no roof, "; if ( bCarpet ) MoronString = MoronString $ "has carpet, "; else MoronString = MoronString $ "no carpet, "; if ( bFloor ) MoronString = MoronString $ "has foundation. Total objects: "; else MoronString = MoronString $ "no foundation. Total objects: "; MoronString = MoronString $ TotalObjects; Instigator.ClientMessage(MoronString); } simulated exec function SetBuildMode(string NewMode) { local class TempDecoClass; local int URBS; if ( Caps(NewMode) ~= "NORMAL" || Caps(NewMode) ~= "HOUSE" ) { BuildingMode = BM_Normal; Instigator.ClientMessage("Build mode set to Normal (build house)"); BuildModeString = "Normal (build house)"; } else if ( Caps(NewMode) ~= "LOAD" ) { BuildingMode = BM_LoadHouse; Instigator.ClientMessage("Build mode set to Load Saved House"); BuildModeString = "Load Saved House"; } else if ( Caps(NewMode) ~= "TABLE" ) { BuildingMode = BM_PlaceTable; Instigator.ClientMessage("Build mode set to Place Table"); BuildModeString = "Place Table"; } else if ( Caps(NewMode) ~= "LAMP" ) { BuildingMode = BM_PlaceLamp; Instigator.ClientMessage("Build mode set to Place Lamp"); BuildModeString = "Place Lamp"; } else if ( Caps(NewMode) ~= "STOVE" ) { BuildingMode = BM_PlaceStove; Instigator.ClientMessage("Build mode set to Place Stove"); BuildModeString = "Place Stove"; } else if ( Caps(NewMode) ~= "BENCH" ) { BuildingMode = BM_PlaceBench; Instigator.ClientMessage("Build mode set to Place Bench"); BuildModeString = "Place Bench"; } else if ( Caps(NewMode) ~= "BED" ) { BuildingMode = BM_PlaceBed; Instigator.ClientMessage("Build mode set to Place Bed"); BuildModeString = "Place Bed"; } else if ( Caps(NewMode) ~= "FLOOR" || Caps(NewMode) ~= "CEILING" ) { BuildingMode = BM_ExtendCeiling; Instigator.ClientMessage("Build mode set to Extend Ceiling/Floor"); BuildModeString = "Extend Ceiling/Floor"; } else if ( Caps(NewMode) ~= "WALL" || Caps(NewMode) ~= "EXTENDWALL" ) { BuildingMode = BM_ExtendWall; Instigator.ClientMessage("Build mode set to Extend Wall"); BuildModeString = "Extend Wall"; } else if ( Caps(NewMode) ~= "ROTATE" || Caps(NewMode) ~= "ROTATEWALL" || Caps(NewMode) ~= "CORNER" ) { BuildingMode = BM_RotateWall; Instigator.ClientMessage("Build mode set to Rotate Wall (90 degrees)"); BuildModeString = "Rotate Wall (90 degrees)"; } else if ( Caps(NewMode) ~= "CARPET" ) { BuildingMode = BM_PlaceCarpet; Instigator.ClientMessage("Build mode set to Place Carpet"); BuildModeString = "Place Carpet"; } else if ( Caps(NewMode) ~= "GATE" ) { BuildingMode = BM_PlaceGate; Instigator.ClientMessage("Build mode set to Place Gate (shoot a wall)"); BuildModeString = "Place Gate (shoot a wall)"; } else if ( Caps(NewMode) ~= "NONE" || NewMode ~= "" ) { BuildingMode = BM_None; Instigator.ClientMessage("Build mode set to None (can only delete objects)"); BuildModeString = "None (can only delete objects)"; } else // try to load a decoration { TempDecoClass = (Class(DynamicLoadObject(NewMode, class'Class'))); if ( TempDecoClass == None ) // if not found, try adding "Unreali." to the class name TempDecoClass = (Class(DynamicLoadObject(("Unreali."$NewMode), class'Class'))); if ( TempDecoClass != None && TempDecoClass.Default.Mesh != None ) { GenericDecoClass = TempDecoClass; BuildingMode = BM_PlaceGeneric; while ( URBS >= 0 && Len(NewMode) > 0 ) { URBS = InStr(NewMode,"."); if ( URBS >= 0 && (URBS+1 < Len(NewMode)) ) NewMode = Mid(NewMode, (URBS+1)); } Instigator.ClientMessage("Build mode set to Place Special: "$NewMode); BuildModeString = ("Place Special: "$NewMode); } else Instigator.ClientMessage("Object \""$NewMode$"\" not found or invalid"); } } simulated exec function KillHouse(optional bool NoMessage) { local Decoration D; if ( Level.TimeSeconds - LastSpamTime < 1.0 ) return; LastSpamTime = Level.TimeSeconds; foreach AllActors( class'Decoration', D ) { if ( D.Owner == Self ) { D.Destroy(); --DecosPlaced; } } if ( !NoMessage ) Instigator.ClientMessage("House destroyed"); } simulated exec function RecountHouse(optional bool NoMessage) { local Decoration D; local int TotalDecos; if ( Level.TimeSeconds - LastSpamTime < 1.0 ) return; LastSpamTime = Level.TimeSeconds; foreach AllActors( class'Decoration', D ) if ( D.Owner == Self ) ++TotalDecos; DecosPlaced = TotalDecos; if ( !NoMessage && Level.NetMode == NM_StandAlone ) Instigator.ClientMessage("Objects recounted; total: "$TotalDecos$"/1000"); else if ( !NoMessage ) Instigator.ClientMessage("Objects recounted; total: "$TotalDecos$"/100"); } simulated exec function ToggleGateLock() { local GateTriggerThingy GTG, ChosenGTG; local float GTGDist; foreach Instigator.RadiusActors(class'GateTriggerThingy', GTG, 500) { if ( GTG.Owner == Self && (ChosenGTG == None || VSize(GTG.Location - Location) < GTGDist) ) { ChosenGTG = GTG; GTGDist = VSize(ChosenGTG.Location - Location); } } if ( ChosenGTG != None ) ChosenGTG.ToLockOrToUnlock(); else Instigator.ClientMessage("No nearby controlled gates found"); } function Destroyed() { local Decoration Deco; // destroy house foreach AllActors( class'Decoration', Deco ) if ( Deco.Owner == Self ) Deco.Destroy(); Super.Destroyed(); } function SpawnHouse( vector FoundationCenter ) { local vector CurrentLocation, Origin, CeilingLocation, PortalLocation; local Actor A; local Decoration Deco, D; local int x, y, z; local int Aye; local HouseFloorPorter HFP; //log(Self$": SpawnHouse called"); if ( Level.TimeSeconds - LastSpamTime < 1.0 ) return; LastSpamTime = Level.TimeSeconds; HouseCenter = FoundationCenter; // destroy house foreach AllActors( class'Decoration', D ) { if ( D.Owner == Self ) { D.Destroy(); --DecosPlaced; } } Origin.X = FoundationCenter.X - WallWidth - (WallWidth*(HouseXSize-1)); Origin.Y = FoundationCenter.Y - WallWidth - (WallWidth*(HouseYSize-1)); Origin.Z = FoundationCenter.Z; CurrentLocation.X = Origin.X + WallWidth; CurrentLocation.Y = Origin.Y + WallWidth; CurrentLocation.Z = Origin.Z; for ( z = 0; z < HouseZLevels; z++ ) { for ( y = 0; y < HouseYSize; y++ ) { for ( x = 0; x < HouseXSize; x++ ) { if ( bCarpet ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } A = Spawn(class'CARPET.CARPET', self,, (CurrentLocation+vect(0,0,5))); if ( A != None ) { ++DecosPlaced; A.SetRotation(rot(0,0,0)); A.SetPhysics(PHYS_None); A.SetCollision(True,False,False); A.bProjTarget = True; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation+vect(0,0,5)); A.RemoteRole = ROLE_SimulatedProxy; } } for ( Aye = 1; Aye <= 4; Aye++ ) { if ( ShouldHaveWall((x+1),(y+1),Aye) ) { if ( DecosPlaced >= 999 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 99) ) { MoronMessage("This house is too big!"); return; } BuildWall(CurrentLocation,Aye); } } if ( bRoof || z < (HouseZLevels-1) ) { CeilingLocation = CurrentLocation; CeilingLocation.Z += (WallHeight-16); if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } A = Spawn(class'Ceiling.Ceiling', self,, CeilingLocation); if ( A != None ) { ++DecosPlaced; A.SetRotation(rot(0,0,0)); A.SetCollisionSize(350.0,16.0); A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CeilingLocation); A.RemoteRole = ROLE_SimulatedProxy; } } if ( bFloor && z == 0 ) { CeilingLocation = CurrentLocation; CeilingLocation.Z -= 16; if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } A = Spawn(class'Ceiling.Ceiling', self,, CeilingLocation); if ( A != None ) { ++DecosPlaced; A.SetRotation(rot(0,0,0)); A.SetCollisionSize(350.0,16.0); A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CeilingLocation); A.RemoteRole = ROLE_SimulatedProxy; } } // teleporters if ( HouseZLevels > 1 && HouseXSize > 1 ) { PortalLocation = CurrentLocation; PortalLocation.Z += 32; if ( (x == 0 && y == (HouseYSize-1) && float(z/2) == (float(z)/2)) || (x == (HouseXSize-1) && y == (HouseYSize-1) && float(z/2) != (float(z)/2)) ) { PortalLocation.Y -= (WallWidth/2); if ( z > 0 ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } HFP = Spawn(class'HouseFloorPorter', self,, PortalLocation, rot(0,0,0)); if ( HFP != None ) { ++DecosPlaced; HFP.GoingUp = False; HFP.RemoteRole = ROLE_SimulatedProxy; } if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } A = Spawn(class'MotionlessWire', self,, (PortalLocation-vect(0,0,130)),rot(0,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(PortalLocation-vect(0,0,130)); A.RemoteRole = ROLE_SimulatedProxy; } } PortalLocation.Y += WallWidth; if ( z < (HouseZLevels-1) ) { if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } HFP = Spawn(class'HouseFloorPorter', self,, PortalLocation, rot(0,0,0)); if ( HFP != None ) { ++DecosPlaced; HFP.GoingUp = True; HFP.RemoteRole = ROLE_SimulatedProxy; } if ( DecosPlaced >= 1000 || (Level.NetMode != NM_StandAlone && DecosPlaced >= 100) ) { MoronMessage("This house is too big!"); return; } A = Spawn(class'MotionlessWire', self,, (PortalLocation+vect(0,0,130)),rot(32768,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(PortalLocation+vect(0,0,130)); A.RemoteRole = ROLE_SimulatedProxy; } } } } CurrentLocation.X += (WallWidth*2); } CurrentLocation.X = Origin.X + WallWidth; CurrentLocation.Y += (WallWidth*2); } CurrentLocation.Y = Origin.Y + WallWidth; CurrentLocation.Z += WallHeight; } } // Meaning of "side" int variable: // // Side 3 // +----+ // Side | | Side // 2 | | 1 // +----+ // Side 4 // function bool ShouldHaveWall(int X, int Y, int WhichSide) { if ( WhichSide == 1 ) { if ( (X+1) > HouseXSize ) return true; else return false; } else if ( WhichSide == 2 ) { if ( (X-1) <= 0 ) return true; else return false; } else if ( WhichSide == 3 ) { if ( (Y+1) > HouseYSize ) return true; else return false; } else if ( WhichSide == 4 ) { if ( (Y-1) <= 0 ) return true; else return false; } } function BuildWall(vector CarpetLocation, int WhichSide) { local vector CurrentLocation; local Actor A; CurrentLocation = CarpetLocation; CurrentLocation.Z = CarpetLocation.Z + (WallActualHeight/2); if ( WhichSide == 1 ) { CurrentLocation.X += WallWidth + (WallDepth/2); CurrentLocation.Y -= (WallWidth/2); A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,16384,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } CurrentLocation.Y += WallWidth; A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,16384,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } return; } else if ( WhichSide == 2 ) { CurrentLocation.X -= WallWidth + (WallDepth/2); CurrentLocation.Y -= (WallWidth/2); A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,16384,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } CurrentLocation.Y += WallWidth; A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,16384,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } return; } else if ( WhichSide == 3 ) { CurrentLocation.Y += WallWidth + (WallDepth/2); CurrentLocation.X -= (WallWidth/2); A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } CurrentLocation.X += WallWidth; A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } return; } else if ( WhichSide == 4 ) { CurrentLocation.Y -= WallWidth + (WallDepth/2); CurrentLocation.X -= (WallWidth/2); A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } CurrentLocation.X += WallWidth; A = Spawn(class'Wall.Wall', self,, CurrentLocation, rot(0,0,0)); if ( A != None ) { ++DecosPlaced; A.bCollideWhenPlacing = False; A.bCollideWorld = False; A.SetLocation(CurrentLocation); A.RemoteRole = ROLE_SimulatedProxy; } return; } } NLÿÿÿÿwNLýÿÿÿeküÿÿÿJLÿÿÿÿLÿÿÿÿ*LÿÿÿÿFGþÿÿÿTGþÿÿÿyyþÿÿÿk[ûÿÿÿ[ûÿÿÿx[ûÿÿÿ@búÿÿÿLýÿÿÿgLýÿÿÿLbþÿÿÿVGþÿÿÿJLýÿÿÿGLýÿÿÿyLýÿÿÿa`þÿÿÿ"Lÿÿÿÿ`þÿÿÿULÿÿÿÿHLýÿÿÿ[küÿÿÿfLýÿÿÿ`Láÿÿÿ N [úÿÿÿGNLýÿÿÿxyþÿÿÿqbþÿÿÿILýÿÿÿdN Lßÿÿÿz`æÿÿÿjGþÿÿÿxLÐÿÿÿ [þÿÿÿTLýÿÿÿFNLýÿÿÿRLÓÿÿÿN aäÿÿÿ{FüÿÿÿLgþÿÿÿ`þÿÿÿ!LýÿÿÿiLßÿÿÿEaäÿÿÿCLÚÿÿÿBLÆÿÿÿ&N&güÿÿÿ}[þÿÿÿ(LÚÿÿÿ@aäÿÿÿEgæÿÿÿ+`ùÿÿÿ{NhLµÿÿÿSL¿ÿÿÿhNP`þÿÿÿ%gæÿÿÿbgæÿÿÿ,gæÿÿÿN[þÿÿÿ'NUNS`þÿÿÿtL¶ÿÿÿUL¯ÿÿÿM`þÿÿÿKLÿÿÿÿzNMLßÿÿÿDiÊÿÿÿWgÙÿÿÿ)L¼ÿÿÿPgÙÿÿÿcg­ÿÿÿ/gÙÿÿÿYiÃÿÿÿnLÚÿÿÿAgæÿÿÿGLÿÿÿÿ{[èÿÿÿgbæÿÿÿvg¤ÿÿÿigþÿÿÿyæÿÿÿw[èÿÿÿhLýÿÿÿObøÿÿÿHgþÿÿÿ,bþÿÿÿlLýÿÿÿbLýÿÿÿfLýÿÿÿkNe+u–ÿÿÿf”|[A”X iA–™R vA”Æ| BB”|OB•A ]B”³|jBç™BxB•™SFC–¤D TC‡ B`C•ÆC bG¢¢y oG•_{G–’D IH”’Q VH–˜w cH¢˜v oH–˜@ {H¢™: GI–˜ TI¶kl`I•³C LL”¤V YL–˜x fL¬qsL” a AM–³x NM•³E ZM•™UgM–ˆh wM–„h DN oPN•X _N”³G lN›™7 yN‡LEO•³\ QQ”ÃX^Q”¶X lQ¬™ryQ•³D GR¬¤WTR”Y eR–™] rR–™^ ~R¢vH JS•r WS”Z dS–³ qS˜} }S•ˆ^IT–™\ WT¬¢qdT–Ž] sT™P T–³@ LU•„^XUvO fU`rU½if@V–™T fW–³F rW”­Z~W–¢z LX–©~ XX•„_ dX–œ] qX”Ž~ }X”F JY–ÁI WY•ˆ_ dY”­YqY•³B Y¢vI LZ¢vJ YZ¢vK fZ¢vL sZ¢vM @[¢vN M[–ÆI Y[•oe[›™Q s[”³~ [p L\”±Q X\•¤Ae\™m u\”} A]¬%dN]”~ ^]™R k]›™_ x]•¤YE^›¤Z U^™Z a^”¦~ n^•{^•@I_˜s W_˜t d_˜u q_› b }_”·~I`™W W`›­@ c`”©~o`©| }`¢H Ja–Á@ Wa”Ã| da”ˆj qa–Á ~a•xKb•ÆKYb›m gb¦| tbé™Ac”œ~TcÒlibc›n Keè™sXe›l te›…\ Af¢‡F MfÔ)Yf›~~ wf™4WCg™TZj™|nl™Ijn™yspà¤tls›Œ~ `x™+lx™mWyå¤,QD}•’_ U~•’^b~¿+p~™] L¤ehi‹µ™ FQ‘c WŽÛ§G_cŽ™5A B‘È™NhC›› ~ kž™Vwž®¤[ M ¥x]4cV ™puy£§q