Code archives/Miscellaneous/Project PLASMA FPS 2004: Engine Source
This code has been declared by its author to be Public Domain code.
Download source code
Engine SourcePPF2k4 Engine built on top of FPSNET by Jeremy Alessi Last Updates: Smiffs Bot Code - 09/20/04 |
;====== FPSNet: A NETWORKED FIRST PERSON SHOOTER EXAMPLE ================== ;====== UTILIZING ONLY BUILT IN BLITZ3D FEATURES ========================== ;====== A CODESKETCH BY JEREMY ALESSI ===================================== ;====== THANKS MARK SIBLY FOR GNET ======================================== ;====== BOT CODE ADDED BY SMIFF 20/09/2004 ;====== WASD OR CURSORS MOVE, MOUSE LOOKS, LEFT MOUSE BUTTON SHOOTS ======= ;====== SPACE BAR OR 0 ON NUMPAD JUMPS, PRESS C TO CHAT =================== ;====== PRESS 2 TO UNLOCK MOUSE FROM CENTER (USEFUL TO PLAY =============== ;====== AND ALSO BE ABLE TO MULTITASK IF NEED BE) PRESS 1 TO RELOCK ======= ;====== MOUSE BACK TO CENTER OF SCREEN ==================================== ;====== YEAH EVERYONE HAS THE SOURCE ... DON'T CHEAT! ===================== ;====== INCLUDES ========================================================== Include "gnet_v1\gnet_inc.bb"; http://www.blitzbasic.com/toolbox/toolbox.php?tool=61 ;========================================================================== ;====== GRAPHICS ========================================================== Graphics3D(640, 480, 16, 2) SetBuffer BackBuffer() HidePointer ;========================================================================== ;====== COLLISIONS ======================================================== Global ppfps_BODY = 1 Global ppfps_SCENE = 2 Collisions(ppfps_BODY,ppfps_SCENE, 2, 2) Collisions(ppfps_BODY,ppfps_BODY, 2, 2) ;========================================================================== ;====== GLOBALS =========================================================== Global ppfps_gameState$ = "Title Screen" ;Mousehit Vars Global ppfps_mb1pressed, ppfps_mb2pressed ;Keyhit Vars Global ppfps_upKeyPressed, ppfps_downKeyPressed, ppfps_leftKeyPressed, ppfps_rightKeyPressed, ppfps_enterKeyPressed, ppfps_spaceKeyPressed Global ppfps_chatKeyPressed ;Font Vars Global ppfps_font, ppfps_bigFont ;Menu Var Global ppfps_menuCount ;Server Vars Global ppfps_serverCount Global ppfps_serverPointer ;Local ppfps_Player Network Vars Global ppfps_localPlayerName$, ppfps_localPlayerPointer ;Scenery Vars Global ppfps_level,ppfps_copySprite, ppfps_lightPivot ;Camera Var Global ppfps_camera ;ppfps_Player Gameplay Vars Global ppfps_health#, ppfps_shot, ppfps_shot2, ppfps_shot3, ppfps_shotTimer#, ppfps_positionUpdateTimer#, ppfps_serverRefreshTimer#, ppfps_hosting Global ppfps_vX#, ppfps_vY#, ppfps_vZ#, ppfps_oldX#, ppfps_oldY#, ppfps_oldZ#, ppfps_centerMouse = True, ppfps_enteringChat = False, ppfps_chat$ Global ppfps_copyPowerUp, ppfps_weapon$ = "Semi-Automatic", ppfps_powerUpSpawned, ppfps_ammo# = 50, ppfps_randPos, ppfps_randNum Global ppfps_justDied#,ppfps_RespawnDelay#=7000 ;ppfps_Bot globals Global ppfps_Bots=1,ppfps_Botskillppfps_Bots=1,ppfps_Botppfps_positionUpdateTimer# Global ppfps_giro=CreatePivot() ;ppfps_Bot movement constants Const PPFPS_WALK=1 Const PPFPS_BACKUP=2 Const PPFPS_STRAFEL=4 Const PPFPS_STRAFER=8 Const ppfps_jump=16 Const PPFPS_ROTATE=32 ;ppfps_Bot state constants Const ppfps_scan=1 Const PPFPS_ATTACK=2 Const PPFPS_GETAMMO=4 Const PPFPS_RESPAWN=8 ;========================================================================== ;====== INCOMING ========================================================== Dim ppfps_incoming$(100) ;========================================================================== ;====== CONTENTS OF A KEY ================================================= Dim ppfps_keys$(237) ppfps_LoadKeyboardContent() ;========================================================================== ;====== SHOT ARRAY ======================================================== Dim ppfps_pickedArray(3,3) ;========================================================================== Type ppfps_Player Field iD Field name$ Field mesh[10] Field score End Type Global Host.ppfps_Player Type ppfps_Bot Field iD Field name$ Field mesh[10] Field health# Field score Field weapon Field ammo# Field skill# Field range# Field state Field seq Field firing Field shot Field shot2 Field shot3 Field shotTimer# Field target Field targetItem Field justDied# Field scantime# Field timer# Field vX# Field vY# Field vZ# Field oldX# Field oldY# Field oldZ# End Type Dim ppfps_Botnames$(3,10) Type ppfps_Particle Field mesh Field name$ Field alpha# Field vX# Field vY# Field vZ# End Type Type ppfps_chatMsg Field msg$ Field born# Field from End Type Type ppfps_powerUp Field mesh Field name$ Field iD End Type ;========================================================================== ;====== INITIAL SETUP ===================================================== ppfps_Setup("Title Screen") ;========================================================================== ;========================================================================== .Main ;====== RUN =============================================================== ppfps_period=1000 / 30 ppfps_tweentime = MilliSecs()-ppfps_period While 1 ;====== CALCULATE TWEEN =================================================== Repeat ppfps_elapsed = MilliSecs() - ppfps_tweentime Until ppfps_elapsed ppfps_ticks = ppfps_elapsed/ppfps_period ppfps_tween# = Float(ppfps_elapsed Mod ppfps_period) / Float(ppfps_period) ;========================================================================== ;====== MAIN LOOP ========================================================= For ppfps_k=1 To ppfps_ticks ppfps_tweentime = ppfps_tweentime+ppfps_period If ppfps_k = ppfps_ticks Then CaptureWorld If KeyDown(1) If Not GNET_RemoveServer("BOT-FPSNetUpdate") If ppfps_hosting = True RuntimeError "Failed to remove server" EndIf EndIf ClearWorld() End EndIf ppfps_UpdateLogic() UpdateWorld Next RenderWorld(ppfps_tween#) ppfps_Draw() Flip Wend ;=========================================================================== ;====== UPDATE LOGIC ======================================================= Function ppfps_UpdateLogic() Select ppfps_gameState$ Case "Title Screen" ppfps_UpdateTitleInput() ppfps_UpdateTitleScreen() Case "Game" ppfps_DetectPowerUpCollision() ppfps_UpdateGameInput() ppfps_ControlChat() ppfps_UpdateLights() ppfps_UpdateBots() ppfps_UpdateCamera() ppfps_UpdatePlayerMovement() ppfps_HostSpawnPowerups() ppfps_UpdateParticles() ppfps_UpdateNetwork() ppfps_UpdateCenterMouse() End Select End Function ;=========================================================================== ;====== DRAW =============================================================== Function ppfps_Draw() Select ppfps_gameState$ Case "Title Screen" ppfps_DrawTitleScreen() Case "Game" ppfps_DrawGamePlay() End Select End Function ;=========================================================================== ;====== UPDATE TITLE INPUT ================================================= Function ppfps_UpdateTitleInput() ppfps_mb1pressed = MouseHit(1) ppfps_mb2pressed = MouseHit(2) ppfps_upKeyPressed = KeyHit(17) Or KeyHit(200) ppfps_downKeyPressed = KeyHit(31) Or KeyHit(208) ppfps_leftKeyPressed = KeyHit(30) Or KeyHit(203) ppfps_rightKeyPressed = KeyHit(32) Or KeyHit(205) ppfps_enterKeyPressed = KeyHit(28) ppfps_spaceKeyPressed = KeyHit(57) End Function ;=========================================================================== ;====== UPDATE GAME INPUT ================================================== Function ppfps_UpdateGameInput() ppfps_chatKeyPressed = KeyHit(46) ppfps_enterKeyPressed = KeyHit(28) End Function ;=========================================================================== ;====== UPDATE CENTER MOUSE ================================================ Function ppfps_UpdateCenterMouse() If ppfps_centerMouse = True MoveMouse(ppfps_CorrectX(320), ppfps_CorrectY(240)) EndIf If KeyHit(2) ppfps_centerMouse = True EndIf If KeyHit(3) ppfps_centerMouse = False EndIf End Function ;=========================================================================== ;====== UPDATE TITLE SCREEN ================================================ Function ppfps_UpdateTitleScreen() If ppfps_upKeyPressed And ppfps_menuCount > 0 ppfps_menuCount = ppfps_menuCount - 1 EndIf If ppfps_downKeyPressed And ppfps_menuCount < ppfps_serverCount - 1 ppfps_menuCount = ppfps_menuCount + 1 EndIf If ppfps_enterKeyPressed ppfps_gns.GNET_Server = Object.GNET_Server(ppfps_serverPointer) If JoinNetGame(ppfps_gns\server$, ppfps_gns\ip$) FlushKeys Color(255,0,0) Locate(200,130) ppfps_localPlayerName$ = Input("Name - ") Delay(500) FlushKeys ppfps_player.ppfps_Player = New ppfps_Player ppfps_localPlayerPointer = Handle(ppfps_player.ppfps_Player) ppfps_player\iD = CreateNetPlayer(ppfps_localPlayerName$) ppfps_Setup("Game") ppfps_hosting = False EndIf EndIf If ppfps_spaceKeyPressed FlushKeys Color(255,0,0) Locate(150,130) ppfps_localPlayerName$ = Input("Name - ") Locate(150,150) ppfps_Bots=Input("Number of Bots (Recommended Max 8)(0=None) - ") If ppfps_Bots>8 ppfps_Bots=8 If ppfps_Bots>0 Then ppfps_BotNamesFill() Locate(150,170) ppfps_Botskill=Input("ppfps_Bot Skill 1-10 (0=Random) - ") End If If ppfps_Botskill>10 ppfps_Botskill=10 Delay(500) FlushKeys If HostNetGame(ppfps_localPlayerName$) = 2 If GNET_AddServer("BOT-FPSNetUpdate", ppfps_localPlayerName$) ppfps_player.ppfps_Player = New ppfps_Player ppfps_localPlayerPointer = Handle(ppfps_player.ppfps_Player) ppfps_player\iD = CreateNetPlayer(ppfps_localPlayerName$) ppfps_Setup("Game") ppfps_hosting = True ppfps_serverRefreshTimer# = MilliSecs() Host.ppfps_Player=ppfps_player.ppfps_Player Else RuntimeError("Failed to Add Server!") EndIf Else RuntimeError("Failed to Create Net Game!") EndIf For x=1 To ppfps_Bots ppfps_BotsHostSpawn() Next EndIf End Function ;=========================================================================== ;====== UPDATE PLAYER MOVEMENT ============================================= Function ppfps_UpdatePlayerMovement() If ppfps_enteringChat Return ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_oldX# = EntityX(ppfps_player\mesh[1]) ppfps_oldY# = EntityY(ppfps_player\mesh[1]) ppfps_oldZ# = EntityZ(ppfps_player\mesh[1]) If KeyDown(17) Or KeyDown(200) MoveEntity(ppfps_player\mesh[1], 0, 0, .5) EndIf If KeyDown(31) Or KeyDown(208) MoveEntity(ppfps_player\mesh[1], 0, 0, -.5) EndIf If KeyDown(30) Or KeyDown(203) MoveEntity(ppfps_player\mesh[1], -.5, 0, 0) EndIf If KeyDown(32) Or KeyDown(205) MoveEntity(ppfps_player\mesh[1], .5, 0, 0) EndIf ppfps_numColls = CountCollisions(ppfps_player\mesh[1]) If ppfps_numColls = 0 ppfps_vY# = ppfps_vY# - .01 Else ppfps_vY# = 0 EndIf If (KeyDown(57) Or KeyDown(82)) And ppfps_numColls > 0 ppfps_vY# = .2 EndIf TranslateEntity(ppfps_player\mesh[1],0, ppfps_vY#, 0) RotateEntity(ppfps_player\mesh[1], 0, EntityYaw(ppfps_player\mesh[1]) - MouseXSpeed(), 0) ppfps_vX# = EntityX(ppfps_player\mesh[1]) - ppfps_oldX# ppfps_vY# = EntityY(ppfps_player\mesh[1]) - ppfps_oldY# ppfps_vZ# = EntityZ(ppfps_player\mesh[1]) - ppfps_oldZ# End Function ;=========================================================================== ;====== UPDATE BOTS ======================================================= Function ppfps_UpdateBots() ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) If Not ppfps_hosting Then Return For b.ppfps_Bot=Each ppfps_Bot ; State Defaults If b\state=0 b\state=ppfps_scan If b\seq=0 b\seq=PPFPS_ROTATE If b\ammo#<.1 Then b\state=PPFPS_GETAMMO End If Select b\state Case PPFPS_RESPAWN b\seq=PPFPS_ROTATE If b\timer#+ppfps_RespawnDelay# < MilliSecs() EntityAlpha b\mesh[1],1 EntityAlpha b\mesh[2],1 b\state=ppfps_scan SendNetMsg(96,b\iD+",1-",ppfps_player\iD,0,1) End If Case Scan b\seq=PPFPS_ROTATE If b\scantime# + 1000 <MilliSecs() d1=10000 d2=0 For op.ppfps_Player=Each ppfps_Player d2= EntityDistance(b\mesh[1],op\mesh[1]) If d2=<d1 Then If ppfps_LineOfSight3D(b\mesh[1],op\mesh[1],1000.00) b\target=op\mesh[1] b\state=PPFPS_ATTACK End If d1=d2 End If Next b\scantime#=MilliSecs() End If Case PPFPS_ATTACK If b\target >0 PositionEntity ppfps_giro,EntityX(b\mesh[1]),EntityY(b\mesh[1]),EntityZ(b\mesh[1]) PointEntity ppfps_giro,b\target turn#=20-b\skill# tx#=ppfps_curveangle#(EntityPitch(ppfps_giro),EntityPitch(b\mesh[1]),turn#) ty#=ppfps_curveangle#(EntityYaw(ppfps_giro),EntityYaw(b\mesh[1]),turn#) RotateEntity b\mesh[1],tx#,ty#,0 If EntityDistance(b\mesh[1],b\target)<b\range# b\seq=ppfps_jump If ppfps_LineOfSight3D(b\mesh[1],b\target,b\range,90-b\skill) b\firing=True;not yet used ! shoot=Rand(1,15-b\skill) If shoot=1 Then ppfps_Botshoot(b.ppfps_Bot) Else b\firing=False End If Else b\seq=PPFPS_WALK b\firing=False End If Else b\state=ppfps_scan b\firing=False End If Case PPFPS_GETAMMO b\seq=PPFPS_WALK If ppfps_powerUpSpawned pup.ppfps_powerUp=First ppfps_powerUp b\targetItem=pup\mesh PositionEntity ppfps_giro,EntityX(b\mesh[1]),EntityY(b\mesh[1]),EntityZ(b\mesh[1]) PointEntity ppfps_giro,b\targetItem turn#=10-b\skill#;allow more agility when collectimg items tx#=ppfps_curveangle#(EntityPitch(ppfps_giro),EntityPitch(b\mesh[1]),turn#) ty#=ppfps_curveangle#(EntityYaw(ppfps_giro),EntityYaw(b\mesh[1]),turn#) RotateEntity b\mesh[1],tx#,ty#,0 If ppfps_BotPowerUpCollisionDetect(b.ppfps_Bot) b\state=PPFPS_ATTACK End If End If End Select Next .moveppfps_Bot For b.ppfps_Bot = Each ppfps_Bot ppfps_numColls = CountCollisions(b\mesh[1]) b\oldX# = EntityX(b\mesh[1]) b\oldY# = EntityY(b\mesh[1]) b\oldZ# = EntityZ(b\mesh[1]) If (b\seq And PPFPS_WALK) ;KeyDown(17) Or KeyDown(200) If b\target>0 d#=EntityDistance(b\mesh[1],b\target) speed#=ppfps_curvevalue#(d,b\vZ#,20) If speed#>.5 speed#=.5 MoveEntity(b\mesh[1], 0, 0, speed#) Else MoveEntity(b\mesh[1], 0, 0, .5) End If EndIf If b\seq And PPFPS_BACKUP;KeyDown(31) Or KeyDown(208) MoveEntity(b\mesh[1], 0, 0, -.5) EndIf If b\seq And PPFPS_STRAFEL;KeyDown(30) Or KeyDown(203) MoveEntity(b\mesh[1], -.5, 0, 0) EndIf If b\seq And PPFPS_STRAFER;KeyDown(32) Or KeyDown(205) MoveEntity(b\mesh[1], .5, 0, 0) EndIf If b\seq And PPFPS_ROTATE TurnEntity (b\mesh[1],0,.5+(b\skill/20),0) End If ;ppfps_numColls = CountCollisions(b\mesh[1]) If ppfps_numColls = 0 b\vY# = b\vY# - .01 Else b\vY# = 0 EndIf If b\seq = ppfps_jump And (EntityCollided(b\mesh[1],ppfps_SCENE)>0) b\vY# = .2 EndIf TranslateEntity(b\mesh[1],0, b\vY#, 0) b\vX# = EntityX(b\mesh[1]) - b\oldX# b\vY# = EntityY(b\mesh[1]) - b\oldY# b\vZ# = EntityZ(b\mesh[1]) - b\oldZ# Next If ppfps_Botppfps_positionUpdateTimer# + 50 < MilliSecs() ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) For b.ppfps_Bot = Each ppfps_Bot SendNetMsg(91, b\iD+","+EntityX(b\mesh[1]) + "," + EntityY(b\mesh[1]) + "," + EntityZ(b\mesh[1]) + "," + EntityPitch(b\mesh[1]) + "," + EntityYaw(b\mesh[1]) + "," + b\score+ "," +b\ammo+ "," +b\state + "," +b\seq + "," +b\health + "," + b\weapon +" ," + b\range +"-", ppfps_player\iD, 0, 0) Next ppfps_Botppfps_positionUpdateTimer# = MilliSecs() EndIf End Function Function ppfps_BotShoot(b.ppfps_Bot) ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) TFormVector 0,0,100,b\mesh[1],0 Local dx# = TFormedX() Local dy# = TFormedY() Local dz# = TFormedZ() b\shot = 0 b\shot2 = 0 b\shot3 = 0 Select b\weapon Case 1;"Semi-Automatic" If b\shotTimer# + 200 < MilliSecs() And b\ammo# > 0 b\ammo# = b\ammo# - 1 b\shot = LinePick(EntityX(b\mesh[1]),EntityY(b\mesh[1]),EntityZ(b\mesh[1]), dx#,dy#,dz#,0.1) b\shotTimer# = MilliSecs() If b\shot ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 50, 50, 50, 10) SendNetMsg(4,"1," + PickedX() + "," + PickedY() + "," + PickedZ() + "-", ppfps_player\iD, 0, 0) EndIf EndIf Case 2;"Shotgun" If b\shotTimer# + 750 < MilliSecs() And b\ammo# >= 3 b\ammo# = b\ammo# - 3 For i = 1 To 3 Select i Case 1 b\shot = LinePick(EntityX(b\mesh[1])-0.5,EntityY(b\mesh[1]),EntityZ(b\mesh[1]), dx#-0.5,dy#,dz#,0.01) Case 2 b\shot2 = LinePick(EntityX(b\mesh[1]),EntityY(b\mesh[1]),EntityZ(b\mesh[1]), dx#,dy#,dz#,0.01) Case 3 b\shot3 = LinePick(EntityX(b\mesh[1])+0.5,EntityY(b\mesh[1]),EntityZ(b\mesh[1]), dx#+0.5,dy#,dz#,0.01) End Select ppfps_pickedArray(i,1) = PickedX() ppfps_pickedArray(i,2) = PickedY() ppfps_pickedArray(i,3) = PickedZ() Next b\shotTimer# = MilliSecs() If b\shot Or b\shot2 Or b\shot3 For i = 1 To 3 If (i = 1 And b\shot <> 0) Or (i = 2 And b\shot2 <> 0) Or (i = 3 And b\shot3 <> 0) ppfps_ParticlesCreate(ppfps_pickedArray(i,1), ppfps_pickedArray(i,2), ppfps_pickedArray(i,3), 200, 200, 200, 10) EndIf Next SendNetMsg(4,"2," + ppfps_pickedArray(1,1) + "," + ppfps_pickedArray(1,2) + "," + ppfps_pickedArray(1,3) + "," + ppfps_pickedArray(2,1) + "," + ppfps_pickedArray(2,2) + "," + ppfps_pickedArray(2,3) + "," + ppfps_pickedArray(3,1) + "," + ppfps_pickedArray(3,2) + "," + ppfps_pickedArray(3,3) + "-", ppfps_player\iD, 0, 0) EndIf EndIf Case 3;"Flamethrower" If b\shotTimer# + 50 < MilliSecs() And b\ammo# >= .1 b\ammo# = b\ammo# - .1 pppfps_vX# = b\vX# + (EntityX(b\mesh[3], True) - EntityX(b\mesh[2], True)) / 10 pppfps_vY# = b\vY# + (EntityY(b\mesh[3], True) - EntityY(b\mesh[2], True)) / 10 pppfps_vZ# = b\vZ# + (EntityZ(b\mesh[3], True) - EntityZ(b\mesh[2], True)) / 10 SendNetMsg(90, pppfps_vX# + "," + pppfps_vY# + "," + pppfps_vZ# + ","+b\iD+ "-", ppfps_player\iD, 0, 0) ppfps_ParticlesCreate(EntityX(b\mesh[2],True), EntityY(b\mesh[2], True), EntityZ(b\mesh[2], True), 255, 200, 100, 10, pppfps_vX# + Rnd(-.05, .05), pppfps_vY# + Rnd(-.05, .05), pppfps_vZ#, "Flame") b\shot = LinePick(EntityX(b\mesh[1], True), EntityY(b\mesh[1], True), EntityZ(b\mesh[1], True), EntityX(b\mesh[3], True) - EntityX(b\mesh[1], True), EntityY(b\mesh[3], True) - EntityY(b\mesh[1], True), EntityZ(b\mesh[3], True) - EntityZ(b\mesh[1], True)) ppfps_shotTimer# = MilliSecs() If b\shot ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 200, 100, 10, "Flame") SendNetMsg(4,"3," + PickedX() + "," + PickedY() + "," + PickedZ() + "-", ppfps_player\iD, 0, 0) EndIf EndIf End Select ;;; For op.ppfps_Player = Each ppfps_Player Select b\weapon Case 1;"Semi-Automatic" If b\shot = op\mesh[1] ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) If Handle(op.ppfps_Player)=ppfps_localPlayerPointer ppfps_health#=ppfps_health#-5 SendNetMsg(5, "1,10-", ppfps_player\iD, 0, 0) Else SendNetMsg(2, "1,"+b\iD+"-", ppfps_player\iD, op\iD, 0) End If EndIf Case 2;"Shotgun" If b\shot = op\mesh[1] Or ppfps_shot2 = op\mesh[1] Or ppfps_shot3 = op\mesh[1] Select op\mesh[1] Case b\shot If Handle(op.ppfps_Player)=ppfps_localPlayerPointer ppfps_health#=ppfps_health#-5 SendNetMsg(5, "2,10-", ppfps_player\iD, 0, 0) End If ppfps_ParticlesCreate(ppfps_pickedArray(1, 1), ppfps_pickedArray(1, 2), ppfps_pickedArray(1, 3), 255, 0, 0, 10) Case b\shot2 If Handle(op.ppfps_Player)=ppfps_localPlayerPointer ppfps_health#=ppfps_health#-5 SendNetMsg(5, "2,10-", ppfps_player\iD, 0, 0) End If ppfps_ParticlesCreate(ppfps_pickedArray(2, 1), ppfps_pickedArray(2, 2), ppfps_pickedArray(2, 3), 255, 0, 0, 10) Case b\shot3 If Handle(op.ppfps_Player)=ppfps_localPlayerPointer ppfps_health#=ppfps_health#-5 SendNetMsg(5, "2,10-", ppfps_player\iD, 0, 0) End If ppfps_ParticlesCreate(ppfps_pickedArray(3, 1), ppfps_pickedArray(3, 2), ppfps_pickedArray(3, 3), 255, 0, 0, 10) End Select SendNetMsg(2, "2," + Left(Str(ppfps_shot), 1) + "," + Left(Str(ppfps_shot2), 1) + "," + Left(Str(ppfps_shot3), 1)+","+b\iD+"-", ppfps_player\iD, op\iD, 0) EndIf Case 3;"Flamethrower" If b\shot = op\mesh[1] ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) If Handle(op.ppfps_Player)=ppfps_localPlayerPointer ppfps_health#=ppfps_health#-10 SendNetMsg(5, "3,10-", ppfps_player\iD, 0, 0) Else SendNetMsg(2, "3,"+b\iD+"-", ppfps_player\iD, op\iD ,0) End If EndIf End Select If ppfps_health# <= 0;PPFPS_RESPAWN ppfps_health# = 100 ; SendNetMsg(3, "1", ppfps_player\iD, NetMsgFrom(), 1) b\score=b\score+1 b\target=0 b\state=ppfps_scan ppfps_ParticlesCreate(EntityX(ppfps_player\mesh[1]), EntityY(ppfps_player\mesh[1]), EntityZ(ppfps_player\mesh[1]), 255, 0, 0, 100) SendNetMsg(5, "1-",ppfps_player\iD, 0, 0) ppfps_justDied# = MilliSecs() PositionEntity(ppfps_player\mesh[1],5,1,Rand(0, 50)) EndIf Next End Function ;=========================================================================== ;====== UPDATE LIGHTS ====================================================== Function ppfps_UpdateLights() TurnEntity(ppfps_lightPivot, 0, 10, 0) End Function ;=========================================================================== ;====== UPDATE CAMERA ====================================================== Function ppfps_UpdateCamera() ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_shot = 0 ppfps_shot2 = 0 ppfps_shot3 = 0 If MouseDown(1) Select ppfps_weapon$ Case "Semi-Automatic" If ppfps_shotTimer# + 200 < MilliSecs() And ppfps_ammo# > 0 ppfps_ammo# = ppfps_ammo# - 1 ppfps_shot = CameraPick(ppfps_camera, ppfps_CorrectX(320), ppfps_CorrectY(240)) ppfps_shotTimer# = MilliSecs() If ppfps_shot ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 50, 50, 50, 10) SendNetMsg(4,"1," + PickedX() + "," + PickedY() + "," + PickedZ() + "-", ppfps_player\iD, 0, 0) EndIf EndIf Case "Shotgun" If shotTimer# + 750 < MilliSecs() And ppfps_ammo# >= 3 ppfps_ammo# = ppfps_ammo# - 3 For i = 1 To 3 Select i Case 1 ppfps_shot = CameraPick(ppfps_camera, ppfps_CorrectX(320 - 20), ppfps_CorrectY(240)) Case 2 ppfps_shot2 = CameraPick(ppfps_camera, ppfps_CorrectX(320), ppfps_CorrectY(240)) Case 3 ppfps_shot3 = CameraPick(ppfps_camera, ppfps_CorrectX(320 + 20), ppfps_CorrectY(240)) End Select ppfps_pickedArray(i,1) = PickedX() ppfps_pickedArray(i,2) = PickedY() ppfps_pickedArray(i,3) = PickedZ() Next ppfps_shotTimer# = MilliSecs() If ppfps_shot Or ppfps_shot2 Or ppfps_shot3 For i = 1 To 3 If (i = 1 And ppfps_shot <> 0) Or (i = 2 And ppfps_shot2 <> 0) Or (i = 3 And ppfps_shot3 <> 0) ppfps_ParticlesCreate(ppfps_pickedArray(i,1), ppfps_pickedArray(i,2), ppfps_pickedArray(i,3), 200, 200, 200, 10) EndIf Next SendNetMsg(4,"2," + ppfps_pickedArray(1,1) + "," + ppfps_pickedArray(1,2) + "," + ppfps_pickedArray(1,3) + "," + ppfps_pickedArray(2,1) + "," + ppfps_pickedArray(2,2) + "," + ppfps_pickedArray(2,3) + "," + ppfps_pickedArray(3,1) + "," + ppfps_pickedArray(3,2) + "," + ppfps_pickedArray(3,3) + "-", ppfps_player\iD, 0, 0) EndIf EndIf Case "Flamethrower" If ppfps_shotTimer# + 50 < MilliSecs() And ppfps_ammo# >= .1 ppfps_ammo# = ppfps_ammo# - .1 pppfps_vX# = ppfps_vX# + (EntityX(ppfps_player\mesh[3], True) - EntityX(ppfps_player\mesh[2], True)) / 10 pppfps_vY# = ppfps_vY# + (EntityY(ppfps_player\mesh[3], True) - EntityY(ppfps_player\mesh[2], True)) / 10 pppfps_vZ# = ppfps_vZ# + (EntityZ(ppfps_player\mesh[3], True) - EntityZ(ppfps_player\mesh[2], True)) / 10 SendNetMsg(9, pppfps_vX# + "," + pppfps_vY# + "," + pppfps_vZ# + "-", ppfps_player\iD, 0, 0) ppfps_ParticlesCreate(EntityX(ppfps_player\mesh[2],True), EntityY(ppfps_player\mesh[2], True), EntityZ(ppfps_player\mesh[2], True), 255, 200, 100, 10, pppfps_vX# + Rnd(-.05, .05), pppfps_vY# + Rnd(-.05, .05), pppfps_vZ#, "Flame") ppfps_shot = LinePick(EntityX(ppfps_camera, True), EntityY(ppfps_camera, True), EntityZ(ppfps_camera, True), EntityX(ppfps_player\mesh[3], True) - EntityX(ppfps_camera, True), EntityY(ppfps_player\mesh[3], True) - EntityY(ppfps_camera, True), EntityZ(ppfps_player\mesh[3], True) - EntityZ(ppfps_camera, True)) ppfps_shotTimer# = MilliSecs() If ppfps_shot ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 200, 100, 10, "Flame") SendNetMsg(4,"3," + PickedX() + "," + PickedY() + "," + PickedZ() + "-", ppfps_player\iD, 0, 0) EndIf EndIf End Select EndIf RotateEntity(ppfps_camera,EntityPitch(ppfps_camera) + MouseYSpeed(),0,0) If EntityPitch(ppfps_camera) > 90 RotateEntity(ppfps_camera, 90, 0, 0) EndIf If EntityPitch(ppfps_camera) < - 90 RotateEntity(ppfps_camera, -90, 0, 0) EndIf End Function ;=========================================================================== ;====== UPDATE NETWORK ===================================================== Function ppfps_UpdateNetwork() While RecvNetMsg() Select NetMsgType() Case 1;move player For ppfps_player.ppfps_Player = Each ppfps_Player If ppfps_player\iD = NetMsgFrom() ppfps_DecodeIncomingMessage(NetMsgData$()) PositionEntity(ppfps_player\mesh[1], ppfps_incoming$(1), ppfps_incoming$(2), ppfps_incoming$(3)) RotateEntity(ppfps_player\mesh[1], ppfps_incoming$(4), ppfps_incoming$(5), 0) If ppfps_incoming$(6) <> "" ppfps_player\score = ppfps_incoming$(6) EndIf EndIf Next Case 2;hit,blood & PPFPS_RESPAWN ppfps_shotbyppfps_Bot=0 ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_ParticlesCreate(EntityX(ppfps_player\mesh[1]), EntityY(ppfps_player\mesh[1]), EntityZ(ppfps_player\mesh[1]), 255, 0, 0, 10) If ppfps_justDied# + 500 < MilliSecs() ppfps_DecodeIncomingMessage(NetMsgData$()) Select ppfps_incoming$(1) Case 1 ppfps_health# = ppfps_health# - 5 If ppfps_incoming$(2)<>"" ppfps_shotbyppfps_Bot=ppfps_incoming$(2) End If Case 2 If ppfps_incoming$(5)<>"" ppfps_shotbyppfps_Bot=ppfps_incoming$(5) End If count = 0 If ppfps_incoming$(2) <> 0 count = count + 1 EndIf If ppfps_incoming$(3) <> 0 count = count + 1 EndIf If ppfps_incoming$(4) <> 0 count = count + 1 EndIf ppfps_health# = ppfps_health# - (5 * count) Case 3 ppfps_health# = ppfps_health# - 25 If ppfps_incoming$(2)<>"" ppfps_shotbyppfps_Bot=ppfps_incoming$(2) End If End Select EndIf If ppfps_health# <= 0;PPFPS_RESPAWN ppfps_health# = 100 SendNetMsg(3, ppfps_shotbyppfps_Bot+"-", ppfps_player\iD, NetMsgFrom(), 1) ppfps_ParticlesCreate(EntityX(ppfps_player\mesh[1]), EntityY(ppfps_player\mesh[1]), EntityZ(ppfps_player\mesh[1]), 255, 0, 0, 100) SendNetMsg(5, "1-",ppfps_player\iD, 0, 0) ppfps_justDied# = MilliSecs() PositionEntity(ppfps_player\mesh[1],5,1,Rand(0, 50)) EndIf Case 3;increase score for kill: update local player or ppfps_Bot if ppfps_hosting ppfps_DecodeIncomingMessage(NetMsgData$()) If ppfps_incoming$(1)<>"0" For b.ppfps_Bot=Each ppfps_Bot If b\iD=ppfps_incoming$(1) b\score=b\score+1 b\target=0 b\state=ppfps_scan End If Next Else ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_player\score = ppfps_player\score + 1 End If Case 4;bullet hit particles ppfps_DecodeIncomingMessage(NetMsgData$()) Select ppfps_incoming$(1) Case 1 ppfps_ParticlesCreate(ppfps_incoming$(2), ppfps_incoming$(3), ppfps_incoming$(4), 50, 50, 50, 10) Case 2 ppfps_ParticlesCreate(ppfps_incoming$(2), ppfps_incoming$(3), ppfps_incoming$(4), 255, 255, 255, 10) ppfps_ParticlesCreate(ppfps_incoming$(5), ppfps_incoming$(6), ppfps_incoming$(7), 255, 255, 255, 10) ppfps_ParticlesCreate(ppfps_incoming$(8), ppfps_incoming$(9), ppfps_incoming$(10), 255, 255, 255, 10) Case 3 ppfps_ParticlesCreate(ppfps_incoming$(2), ppfps_incoming$(3), ppfps_incoming$(4), 255, 200, 100, 10) End Select Case 5;player blood ppfps_DecodeIncomingMessage(NetMsgData$()) If ppfps_incoming(2)<>"" numparticles=ppfps_incoming$(2) Else numparticles=100 End If For ppfps_player.ppfps_Player = Each ppfps_Player If ppfps_player\iD = NetMsgFrom() ppfps_ParticlesCreate(EntityX(ppfps_player\mesh[1]), EntityY(ppfps_player\mesh[1]), EntityZ(ppfps_player\mesh[1]), 255, 0, 0, numparticles) EndIf Next Case 6 c.ppfps_chatMsg = New ppfps_chatMsg c\msg = NetMsgData$() c\born# = MilliSecs() c\from = NetMsgFrom() Case 7;host spawns pup ppfps_DecodeIncomingMessage(NetMsgData$()) pup.ppfps_powerUp = New ppfps_powerUp pup\mesh = CopyEntity(copyPowerup) ppfps_powerUpSpawned = True PositionEntity(pup\mesh, EntityX(GetChild(ppfps_level, ppfps_incoming$(1)), True), EntityY(GetChild(ppfps_level, ppfps_incoming$(1)), True) + 2, EntityZ(GetChild(ppfps_level, ppfps_incoming$(1)), True)) Select ppfps_incoming$(2) Case 1 pup\name$ = "Semi-Automatic" EntityColor(pup\mesh, 255, 255, 255) Case 2 pup\name$ = "Shotgun" EntityColor(pup\mesh, 100, 100, 255) Case 3 pup\name$ = "Flamethrower" EntityColor(pup\mesh, 200, 150, 100) End Select ppfps_randPos = ppfps_incoming$(1) ppfps_randNum = ppfps_incoming$(2) Case 8;pup taken For pup.ppfps_powerUp = Each ppfps_powerUP FreeEntity(pup\mesh) Delete(pup) Next ppfps_powerUpSpawned = False Case 9;flame particles For op.ppfps_Player = Each ppfps_Player If op\iD = NetMsgFrom() ppfps_DecodeIncomingMessage(NetMsgData$()) ppfps_ParticlesCreate(EntityX(op\mesh[2],True), EntityY(op\mesh[2], True), EntityZ(op\mesh[2], True), 255, 200, 100, 10, ppfps_incoming$(1) + Rnd(-.05, .05), ppfps_incoming$(2) + Rnd(-.05, .05), ppfps_incoming$(3), "Flame") EndIf Next Case 90;ppfps_Bot flame particles ppfps_DecodeIncomingMessage(NetMsgData$()) For b.ppfps_Bot = Each ppfps_Bot If b\iD = ppfps_incoming$(4) ppfps_ParticlesCreate(EntityX(b\mesh[2],True), EntityY(b\mesh[2], True), EntityZ(b\mesh[2], True), 255, 200, 100, 10, ppfps_incoming$(1) + Rnd(-.05, .05), ppfps_incoming$(2) + Rnd(-.05, .05), ppfps_incoming$(3), "Flame") EndIf Next Case 91;move & update ppfps_Bot - extra ppfps_Bot info only sent incase host drops out ! ppfps_DecodeIncomingMessage(NetMsgData$()) For b.ppfps_Bot=Each ppfps_Bot If b\iD=ppfps_incoming$(1) PositionEntity(b\mesh[1], ppfps_incoming$(2), ppfps_incoming$(3), ppfps_incoming$(4)) RotateEntity(b\mesh[1], ppfps_incoming$(5), ppfps_incoming$(6), 0) If ppfps_incoming$(7) <> "" b\score = ppfps_incoming$(7) EndIf ;; Only really needed by ppfps_hosting machine If ppfps_incoming$(8) <> "" b\ammo# = ppfps_incoming$(8) EndIf If ppfps_incoming$(9) <> "" b\state = ppfps_incoming$(9) EndIf If ppfps_incoming$(10) <> "" b\seq = ppfps_incoming$(10) EndIf If ppfps_incoming$(11) <> "" b\health# = ppfps_incoming$(11) EndIf If ppfps_incoming$(12) <> "" b\weapon = ppfps_incoming$(12) EndIf If ppfps_incoming$(13) <> "" b\range = ppfps_incoming$(13) EndIf EndIf Next Case 92; ppfps_Bot hit & resspawn ppfps_DecodeIncomingMessage(NetMsgData$()) For b.ppfps_Bot= Each ppfps_Bot If b\iD=ppfps_incoming$(5) ppfps_ParticlesCreate(EntityX(b\mesh[1]), EntityY(b\mesh[1]), EntityZ(b\mesh[1]), 255, 0, 0, 10) ; End Of Client Section If ppfps_hosting If b\justDied# + 500 < MilliSecs() Select ppfps_incoming$(1) Case 1 b\health# = b\health# - 5 Case 2 count = 0 If ppfps_incoming$(2) <> 0 count = count + 1 EndIf If ppfps_incoming$(3) <> 0 count = count + 1 EndIf If ppfps_incoming$(4) <> 0 count = count + 1 EndIf b\health# = b\health# - (5 * count) Case 3 b\health# = b\health# - 25 End Select EndIf If b\ammo#>0 Then For op.ppfps_player=Each ppfps_player If op\iD=NetMsgFrom() b\target=op\mesh[1] b\state=PPFPS_ATTACK End If Next End If If b\health# <= 0;PPFPS_RESPAWN ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) b\health# = 100 b\target=0 b\state=PPFPS_RESPAWN RotateEntity b\mesh[1],0,Rand(0,360),0 SendNetMsg(3, "0-", ppfps_player\iD, NetMsgFrom(), 1) ppfps_ParticlesCreate(EntityX(b\mesh[1]), EntityY(b\mesh[1]), EntityZ(b\mesh[1]), 255, 0, 0, 100) b\justDied# = MilliSecs() PositionEntity(b\mesh[1],5,1,Rand(0, 50)) EntityAlpha b\mesh[1],0 EntityAlpha b\mesh[2],0 b\timer#=MilliSecs() SendNetMsg(96,b\iD+",0-",ppfps_player\iD,0,1) EndIf End If End If ;ppfps_hosting Next Case 95;ppfps_Bot die blood ppfps_DecodeIncomingMessage(NetMsgData$()) For b.ppfps_Bot = Each ppfps_Bot If b\iD = ppfps_incoming$(1) ppfps_ParticlesCreate(EntityX(b\mesh[1]), EntityY(b\mesh[1]), EntityZ(b\mesh[1]), 255, 0, 0, 100) EndIf Next Case 99; spawn client ppfps_Bots ppfps_DecodeIncomingMessage(NetMsgData$()) b.ppfps_Bot = New ppfps_Bot b\iD = ppfps_incoming$(1) b\mesh[1] = CreateSphere(8) b\name$ = ppfps_incoming$(2) EntityColor(b\mesh[1], 255, 255, 0) PositionEntity(b\mesh[1],ppfps_incoming$(3), ppfps_incoming$(4), ppfps_incoming$(5)) EntityType(b\mesh[1],ppfps_BODY) EntityRadius(b\mesh[1], 1.5) EntityPickMode(b\mesh[1], 2) b\mesh[2] = CreateCube(b\mesh[1]) PositionEntity(b\mesh[2], 1, -.5, 1) ScaleEntity(b\mesh[2], .1, .1, .4) EntityColor(b\mesh[2], 20, 20, 20) b\mesh[3] = CreatePivot(b\mesh[1]) PositionEntity(b\mesh[3], 0, 0, 5) b\weapon=ppfps_incoming$(6) b\health=100 Case 96;ppfps_Bot hide/show ppfps_DecodeIncomingMessage(NetMsgData$()) For b.ppfps_Bot = Each ppfps_Bot If b\iD = ppfps_incoming$(1) Select ppfps_incoming$(2) Case 1 ShowEntity b\mesh[1] Case 0 HideEntity b\mesh[1] End Select EndIf Next Case 100; ppfps_NEW player joined ppfps_player.ppfps_Player = New ppfps_Player ppfps_player\iD = NetMsgFrom() ppfps_player\mesh[1] = CreateSphere(8) ppfps_player\name$ = NetPlayerName$(ppfps_player\iD) EntityColor(ppfps_player\mesh[1], 0, 255, 0) PositionEntity(ppfps_player\mesh[1], 5, 1.5, Rand(50,100)) EntityType(ppfps_player\mesh[1],ppfps_BODY) EntityRadius(ppfps_player\mesh[1], 1.5) EntityPickMode(ppfps_player\mesh[1], 2) ppfps_player\mesh[2] = CreateCube(ppfps_player\mesh[1]) PositionEntity(ppfps_player\mesh[2], 1, -.5, 1) ScaleEntity(ppfps_player\mesh[2], .1, .1, .4) EntityColor(ppfps_player\mesh[2], 20, 20, 20) ppfps_player\mesh[3] = CreatePivot(ppfps_player\mesh[1]) PositionEntity(ppfps_player\mesh[3], 0, 0, 5) If ppfps_hosting ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) SendNetMsg(7, ppfps_randPos + "," + ppfps_randNum + "-", ppfps_player\iD#, NetMsgFrom(), 1) For b.ppfps_Bot=Each ppfps_Bot SendNetMsg(99, b\iD+ "," +b\name$+ "," +EntityX(b\mesh[1],True) + "," + EntityY(b\mesh[1],True) + "," +EntityZ(b\mesh[1],True) +","+ b\weapon+"-", ppfps_player\iD#, NetMsgFrom(), 1) Next EndIf Case 101;player left For ppfps_player.ppfps_Player = Each ppfps_Player For b.ppfps_Bot=Each ppfps_Bot If b\target=ppfps_player\mesh[1] b\target=0 End If Next If ppfps_player\iD = NetMsgFrom() FreeEntity(ppfps_player\mesh[1]) Delete(ppfps_player) EndIf Next Case 102;host left GNET_AddServer("FPSNetUpdate", ppfps_localPlayerName$) ppfps_hosting = True host.ppfps_Player=Object.ppfps_Player(ppfps_localPlayerPointer) End Select Wend ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) If ppfps_positionUpdateTimer# + 50 < MilliSecs() SendNetMsg(1, EntityX(ppfps_player\mesh[1]) + "," + EntityY(ppfps_player\mesh[1]) + "," + EntityZ(ppfps_player\mesh[1]) + "," + EntityPitch(ppfps_camera) + "," + EntityYaw(ppfps_player\mesh[1]) + "," + ppfps_player\score + "-", ppfps_player\iD, 0, 0) ppfps_positionUpdateTimer# = MilliSecs() EndIf .detect_player_shoots_player For op.ppfps_Player = Each ppfps_Player Select ppfps_weapon$ Case "Semi-Automatic" If ppfps_shot = op\mesh[1] ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) SendNetMsg(2, "1-", ppfps_player\iD, op\iD, 0) EndIf Case "Shotgun" If ppfps_shot = op\mesh[1] Or ppfps_shot2 = op\mesh[1] Or ppfps_shot3 = op\mesh[1] Select op\mesh[1] Case ppfps_shot ppfps_ParticlesCreate(ppfps_pickedArray(1, 1), ppfps_pickedArray(1, 2), ppfps_pickedArray(1, 3), 255, 0, 0, 10) Case ppfps_shot2 ppfps_ParticlesCreate(ppfps_pickedArray(2, 1), ppfps_pickedArray(2, 2), ppfps_pickedArray(2, 3), 255, 0, 0, 10) Case ppfps_shot3 ppfps_ParticlesCreate(ppfps_pickedArray(3, 1), ppfps_pickedArray(3, 2), ppfps_pickedArray(3, 3), 255, 0, 0, 10) End Select SendNetMsg(2, "2," + Left(Str(ppfps_shot), 1) + "," + Left(Str(ppfps_shot2), 1) + "," + Left(Str(ppfps_shot3), 1) + "-", ppfps_player\iD, op\iD, 0) EndIf Case "Flamethrower" If ppfps_shot = op\mesh[1] ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) SendNetMsg(2, "3-", ppfps_player\iD, op\iD, 0) EndIf End Select Next .detect_player_shoots_ppfps_Bots If ppfps_Bots For b.ppfps_Bot = Each ppfps_Bot ret=0 Select ppfps_weapon$ Case "Semi-Automatic" If ppfps_shot = b\mesh[1] ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) SendNetMsg(92, "1,0,0,0,"+b\iD+"-", ppfps_player\iD, 0, 0) If ppfps_hosting b\health# = b\health# - 5:ret=1 EndIf Case "Shotgun" If ppfps_shot = b\mesh[1] Or ppfps_shot2 = b\mesh[1] Or ppfps_shot3 = b\mesh[1] Select b\mesh[1] Case ppfps_shot If ppfps_hosting b\health# = b\health# - 5:ret=1 ppfps_ParticlesCreate(ppfps_pickedArray(1, 1), ppfps_pickedArray(1, 2), ppfps_pickedArray(1, 3), 255, 0, 0, 10) Case ppfps_shot2 If ppfps_hosting b\health# = b\health# - 5:ret=1 ppfps_ParticlesCreate(ppfps_pickedArray(2, 1), ppfps_pickedArray(2, 2), ppfps_pickedArray(2, 3), 255, 0, 0, 10) Case ppfps_shot3 If ppfps_hosting b\health# = b\health# - 5:ret=1 ppfps_ParticlesCreate(ppfps_pickedArray(3, 1), ppfps_pickedArray(3, 2), ppfps_pickedArray(3, 3), 255, 0, 0, 10) End Select SendNetMsg(92, "2," + Left(Str(ppfps_shot), 1) + "," + Left(Str(ppfps_shot2), 1) + "," + Left(Str(ppfps_shot3), 1)+ "," + b\iD+ "-", ppfps_player\iD, 0, 0) EndIf Case "Flamethrower" If ppfps_shot = b\mesh[1] If ppfps_hosting b\health# = b\health# - 25:ret=1 ppfps_ParticlesCreate(PickedX(), PickedY(), PickedZ(), 255, 0, 0, 10) SendNetMsg(92, "3,0,0,0,"+b\iD+"-", ppfps_player\iD, 0, 0) EndIf End Select If ppfps_hosting ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) If ret And (b\ammo#>0) b\target=ppfps_player\mesh[1] b\state=PPFPS_ATTACK b\seq=PPFPS_WALK End If If b\health# <= 0;PPFPS_RESPAWN b\health# = 100 ppfps_player\score=ppfps_player\score+1 ppfps_ParticlesCreate(EntityX(b\mesh[1]), EntityY(b\mesh[1]), EntityZ(b\mesh[1]), 255, 0, 0, 100) SendNetMsg(95, b\iD+"-",ppfps_player\iD, 0, 0) b\justDied# = MilliSecs() PositionEntity(b\mesh[1],Rand(0,50),1.5,Rand(0, 50)) b\target=0 b\state=PPFPS_RESPAWN RotateEntity b\mesh[1],0,Rand(0,360),0 EntityAlpha b\mesh[1],0 EntityAlpha b\mesh[2],0 b\timer#=MilliSecs() SendNetMsg(96,b\iD+",0-",ppfps_player\iD,0,1) EndIf End If Next End If ;ppfps_Bots ;ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; If ppfps_hosting = True If ppfps_serverRefreshTimer# + 250000 < MilliSecs() ; GNET_RefreshServer( "FPSNetUpdate",ppfps_localPlayerName$ ) ppfps_serverRefreshTimer# = MilliSecs() EndIf EndIf End Function ;=========================================================================== ;====== UPDATE ppfps_ParticleS =================================================== Function ppfps_UpdateParticles() For ppfps_player.ppfps_Particle = Each ppfps_Particle If ppfps_player\alpha# <= 0 FreeEntity(ppfps_player\mesh) Delete(ppfps_player) Else Select ppfps_player\name$ Case "Flame" TranslateEntity(ppfps_player\mesh,ppfps_player\vX#, ppfps_player\vY#, ppfps_player\vZ# ) ppfps_player\alpha# = ppfps_player\alpha# - Rnd(.3) EntityAlpha(ppfps_player\mesh, ppfps_player\alpha#) Default ppfps_player\vY# = ppfps_player\vY# - .01 TranslateEntity(ppfps_player\mesh,ppfps_player\vX#, ppfps_player\vY#, ppfps_player\vZ#) ppfps_player\alpha# = ppfps_player\alpha# - .02 EntityAlpha(ppfps_player\mesh, ppfps_player\alpha#) End Select EndIf Next End Function ;=========================================================================== ;====== DRAW TITLE SCREEN ================================================== Function ppfps_DrawTitleScreen() Cls ppfps_FPSNetText(ppfps_font, 320, 0, String$("+",80), 1, 1, 100, 100, 100) ppfps_FPSNetText(ppfps_font, 320, 480, String$("+",80), 1, 1, 100, 100, 100) For i = 0 To 640 Step 640 For j = 10 To 470 Step 10 ppfps_FPSNetText(ppfps_font, i, j, "+", 1, 1, 100, 100, 100) Next Next ppfps_FPSNetText(ppfps_bigFont, 320, 30, "BOT-FPSNet:", 1, 1, 255, 0, 0) ppfps_FPSNetText(ppfps_font, 320, 60, "A NETWORKED First Person Shooter Example", 1, 1, 100, 100, 100) ppfps_FPSNetText(ppfps_font, 320, 80, "Press Up/Down to Select a Game to Join!", 1, 1, 100, 100, 100) ppfps_FPSNetText(ppfps_font, 320, 100, "Press Space to Host a New Game!", 1, 1, 100, 100, 100) ppfps_FPSNetText(ppfps_font, 320, 120, "Games In Progress:" , 1, 1, 200, 255, 150) ppfps_serverCount = 0 For ppfps_gns.GNET_Server = Each GNET_Server Select ppfps_serverCount Case ppfps_menuCount ppfps_FPSNetText(ppfps_font, 320, 160 + 20 * ppfps_serverCount, ppfps_gns\server$ + " - Press Enter to Join ...", 1, 1, 255, 255, 255) ppfps_serverPointer = Handle(ppfps_gns) Default ppfps_FPSNetText(ppfps_font, 320, 160 + 20 * ppfps_serverCount, ppfps_gns\server$, 1, 1, 100, 100, 100) End Select ppfps_serverCount = ppfps_serverCount + 1 Next End Function ;=========================================================================== ;====== DRAW GAMEPLAY ====================================================== Function ppfps_DrawGamePlay() Select ppfps_weapon$ Case "Semi-Automatic" ppfps_FPSNetText(ppfps_font, 320, 240, "+", 1, 1, 255, 255, 255) Case "Shotgun" ppfps_FPSNetText(ppfps_font, 300, 240, "+", 1, 1, 255, 255, 255) ppfps_FPSNetText(ppfps_font, 320, 240, "+", 1, 1, 255, 255, 255) ppfps_FPSNetText(ppfps_font, 340, 240, "+", 1, 1, 255, 255, 255) Case "Flamethrower" ppfps_FPSNetText(ppfps_font, 320, 240, "()", 1, 1, 255, 200, 100) End Select ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_FPSNetText(ppfps_font, 0, 0, "Your Score: " + ppfps_player\score, 0, 0, 255, 0, 0) ppfps_FPSNetText(ppfps_font, 150, 0, "Health: ", 0, 0, 0, 255, 0) Color(255, 0, 0) Rect(ppfps_CorrectX(221), ppfps_CorrectY(4), ppfps_CorrectX(ppfps_health#), ppfps_CorrectY(10), 1) Color(255, 255, 255) Rect(ppfps_CorrectX(220), ppfps_CorrectY(2), ppfps_CorrectX(102), ppfps_CorrectY(14), 0) ppfps_FPSNetText(ppfps_font, 400, 0, "Ammo: " + Int(ppfps_ammo#), 0, 0, 255, 255, 255) printI = 50 For c.ppfps_chatMsg = Each ppfps_chatMsg secondsAround = (MilliSecs() - c\born#) / 50 ppfps_FPSNetText(ppfps_font, 0, 0 + printI, NetPlayerName(c\from) + " - " + c\msg$, 0, 0, 255 - secondsAround, 255 - secondsAround, 255 - secondsAround) printI = printI + 15 Next If ppfps_enteringChat = True ppfps_FPSNetText(ppfps_font, 0, 460, ppfps_localPlayerName$ + " - " + ppfps_chat$, 0, 0, 255, 255, 255) EndIf For ppfps_player.ppfps_Player = Each ppfps_Player If Handle(ppfps_player.ppfps_Player) <> ppfps_localPlayerPointer CameraProject(ppfps_camera, EntityX(ppfps_player\mesh[1]), EntityY(ppfps_player\mesh[1]), EntityZ(ppfps_player\mesh[1])) ppfps_FPSNetText(ppfps_font, ProjectedX(), ProjectedY() - 20, ppfps_player\name$ + " - " + ppfps_player\score, 1, 1, 255, 255, 255) EndIf Next For b.ppfps_Bot = Each ppfps_Bot If b\state<>PPFPS_RESPAWN CameraProject(ppfps_camera, EntityX(b\mesh[1]), EntityY(b\mesh[1]), EntityZ(b\mesh[1])) ppfps_FPSNetText(ppfps_font, ProjectedX(), ProjectedY() - 20, b\name$ + " - " + b\score, 1, 1, 255, 255, 255) End If Next End Function ;=========================================================================== ;====== DETECT POWERUP COLLISION =========================================== Function ppfps_DetectPowerUpCollision() If Not ppfps_powerUpSpawned Return ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) For pup.ppfps_powerUp = Each ppfps_powerUp If EntityDistance(ppfps_player\mesh[1], pup\mesh) < 3 If ppfps_weapon$ = pup\name$ Select ppfps_weapon$ Case "Semi-Automatic" ppfps_ammo# = ppfps_ammo# + 50 Case "Shotgun" ppfps_ammo# = ppfps_ammo# + 45 Case "Flamethrower" ppfps_ammo# = ppfps_ammo# + 30 End Select Else Select pup\name$ Case "Semi-Automatic" ppfps_ammo# = 50 Case "Shotgun" ppfps_ammo# = 45 Case "Flamethrower" ppfps_ammo# = 30 End Select EndIf ppfps_weapon$ = pup\name$ ppfps_powerUpSpawned = False FreeEntity(pup\mesh) Delete(pup) SendNetMsg(8, "", ppfps_player\iD, 0, 1) EndIf Next End Function ;=========================================================================== ;====== DETECT BOT POWERUP COLLISION =========================================== Function ppfps_BotPowerUpCollisionDetect(b.ppfps_Bot) ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) For pup.ppfps_powerUp = Each ppfps_powerUp If EntityDistance(b\mesh[1], pup\mesh) < 3 If b\weapon = pup\iD Select b\weapon Case 1;"Semi-Automatic" b\ammo# = b\ammo# + 50 Case 2;"Shotgun" b\ammo# = b\ammo# + 45 Case 3;"Flamethrower" b\ammo# = b\ammo# + 30 End Select Else Select pup\iD Case 1;"Semi-Automatic" b\ammo# = 50 b\range#=40 Case 2;"Shotgun" b\ammo# = 45 b\range#=10 Case 3;"Flamethrower" b\ammo# = 30 b\range=5 End Select b\weapon = pup\iD EndIf b\weapon = pup\iD ppfps_powerUpSpawned = False FreeEntity(pup\mesh) Delete(pup) SendNetMsg(8, "", ppfps_player\iD, 0, 1) Return 1 EndIf Return 0 Next End Function ;=========================================================================== ;====== HOST SPAWN POWERUPS ================================================ Function ppfps_HostSpawnPowerups() If (Not ppfps_hosting) Or (ppfps_powerUpSpawned) Return EndIf ppfps_randPos = Rand(1, CountChildren(ppfps_level)) pup.ppfps_powerUp = New ppfps_powerUp pup\mesh = CopyEntity(ppfps_copyPowerUp) PositionEntity(pup\mesh, EntityX(GetChild(ppfps_level, ppfps_randPos), True), EntityY(GetChild(ppfps_level, ppfps_randPos), True) + 2, EntityZ(GetChild(ppfps_level, ppfps_randPos), True)) ppfps_randNum = Rand(1,3) Select ppfps_randNum Case 1 pup\name$ = "Semi-Automatic" pup\iD=1 EntityColor(pup\mesh, 255, 255, 255) Case 2 pup\name$ = "Shotgun" pup\iD=2 EntityColor(pup\mesh, 100, 100, 255) Case 3 pup\name$ = "Flamethrower" pup\iD=3 EntityColor(pup\mesh, 200, 150, 100) End Select ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) SendNetMsg(7, ppfps_randPos + "," + ppfps_randNum + "-", ppfps_player\iD#, 0, 1) ppfps_powerUpSpawned = True End Function ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;++++++Spawn ppfps_Bots+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function ppfps_BotsHostSpawn() If (Not ppfps_hosting) Return ppfps_randPosX = Rand(1, 40) ppfps_randPosZ = Rand(1, 40) ppfps_randPosY=1.5 b.ppfps_Bot = New ppfps_Bot b\iD = Handle(b.ppfps_Bot) b\mesh[1] = CreateSphere(8) PositionEntity(b\mesh[1],ppfps_randPosX, 1.5,ppfps_randPosZ) EntityColor(b\mesh[1], 255, 255, 0) EntityType(b\mesh[1],ppfps_BODY) EntityRadius(b\mesh[1], 1.5) EntityPickMode(b\mesh[1], 2) b\mesh[2] = CreateCube(b\mesh[1]) PositionEntity(b\mesh[2], 1, -.5, 1) ScaleEntity(b\mesh[2], .1, .1, .4) EntityColor(b\mesh[2], 20, 20, 20) b\mesh[3] = CreatePivot(b\mesh[1]) PositionEntity(b\mesh[3], 0, 0, 5) b\seq=PPFPS_ROTATE b\target=0 b\state=ppfps_scan b\health=100 b\name$=ppfps_Botnames$(0,Rand(0,9))+ppfps_Botnames$(1,Rand(0,9))+ppfps_Botnames$(2,Rand(0,9)) If ppfps_Botskill=0 Then b\skill=Rand(1,10) Else b\skill#=ppfps_Botskill End If ppfps_randNum = Rand(1,3) Select ppfps_randNum Case 1 b\weapon = 1;"Semi-Automatic" b\ammo#=50 b\range#=40 Case 2 b\weapon = 2;"Shotgun" b\ammo=45 b\range#=10 Case 3 b\weapon = 3;"Flamethrower" b\ammo#=30 b\range#=5 End Select ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) SendNetMsg(99, b\iD+ "," +b\name$+ "," +ppfps_randPosX + "," +ppfps_randPosY+ "," + ppfps_randPosZ + "," +b\weapon+"-", ppfps_player\iD#, 0, 1) ppfps_BotSpawned = True End Function ;=========================================================================== ;====== CONTROL CHAT ======================================================= Function ppfps_ControlChat() If ppfps_chatKeyPressed ppfps_enteringChat = True FlushKeys EndIf If ppfps_enterKeyPressed And ppfps_enteringChat = True ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) c.ppfps_chatMsg = New ppfps_chatMsg c\msg$ = ppfps_chat$ c\born# = MilliSecs() c\from = ppfps_player\iD SendNetMsg(6, ppfps_chat$, ppfps_player\iD , 0, 0) ppfps_chat$ = "" ppfps_enteringChat = False EndIf If ppfps_enteringChat = True ppfps_EnterChat() EndIf For c.ppfps_chatMsg = Each ppfps_chatMsg If c\born# + 10000 < MilliSecs() Delete(c) EndIf Next End Function ;=========================================================================== ;====== CREATE SOME ppfps_ParticleS ============================================== Function ppfps_ParticlesCreate(x#, y#, z#, r, g, b, ppfps_ParticlesNum, optppfps_vX# = 0, optppfps_vY# = 0, optppfps_vZ# = 0, passedName$ = "") For i = 1 To ppfps_ParticlesNum ppfps_player.ppfps_Particle = New ppfps_Particle ppfps_player\mesh = CopyEntity(ppfps_copySprite) If passedName$ <> "" ppfps_player\name$ = passedName$ EndIf PositionEntity(ppfps_player\mesh,x#, y#, z#, True) EntityColor(ppfps_player\mesh, r, g, b) If optppfps_vX# = 0 ppfps_player\vX# = Rnd(-.2, .2) Else ppfps_player\vx# = optppfps_vX# EndIf If optppfps_vY# = 0 ppfps_player\vY# = Rnd(.2) Else ppfps_player\vY# = optppfps_vY# EndIf If optppfps_vZ# = 0 ppfps_player\vZ# = Rnd(-.2, .2) Else ppfps_player\vZ# = optppfps_vZ# EndIf ppfps_player\alpha = 1 Next End Function ;=========================================================================== ;====== SETUP ============================================================== Function ppfps_Setup(mode$) SeedRnd MilliSecs() Select mode$ Case "Title Screen" ppfps_font = LoadFont("Arial",20,1) ppfps_bigFont = LoadFont("Arial",50,1) GNET_ListServers() Case "Game" ppfps_gameState$ = "Game" ppfps_player.ppfps_Player = Object.ppfps_Player(ppfps_localPlayerPointer) ppfps_player\mesh[1] = CreatePivot() PositionEntity(ppfps_player\mesh[1], 5, 1.5, Rand(0, 50)) EntityType(ppfps_player\mesh[1],ppfps_BODY) EntityRadius(ppfps_player\mesh[1], 1.5) EntityPickMode(ppfps_player\mesh[1], 1) ppfps_health# = 100 ppfps_player\score = 0 ppfps_player\name$ = ppfps_localPlayerName$ ppfps_camera = CreateCamera(ppfps_player\mesh[1]) CameraRange(ppfps_camera,.1, 500) ppfps_player\mesh[2] = CreateCube(ppfps_camera) PositionEntity(ppfps_player\mesh[2], 1, -.5, 1) ScaleEntity(ppfps_player\mesh[2], .1, .1, .4) EntityColor(ppfps_player\mesh[2], 20, 20, 20) ppfps_player\mesh[3] = CreatePivot(ppfps_camera) PositionEntity(ppfps_player\mesh[3], 0, 0, 5) ppfps_LoadLevel() PointEntity(ppfps_player\mesh[1], ppfps_level) MoveMouse(ppfps_CorrectX(320), ppfps_CorrectY(240)) End Select End Function ;=========================================================================== ;====== LOAD LEVEL ========================================================= Function ppfps_LoadLevel() ppfps_copyPowerUp = CreateSphere() HideEntity(ppfps_copyPowerUp) ppfps_copySprite = CreateSprite() ScaleSprite(ppfps_copySprite, .05, .05) EntityFX(ppfps_copySprite, 1+8) HideEntity(ppfps_copySprite) ppfps_level = CreatePlane(16) EntityPickMode(ppfps_level, 2) For i = -1 To 1 Step 2 For j = -4 To 4 cube = CreateCube(ppfps_level) EntityType(cube, ppfps_SCENE) EntityPickMode(cube, 2) EntityColor(cube, 100, 100, 100) PositionEntity(cube, i * 10, 1, j * 10) Next Next For i = 1 To 8 cube = CreateCube(ppfps_level) EntityType(cube, ppfps_SCENE) EntityPickMode(cube, 2) EntityColor(cube,100,100,100) PositionEntity(cube, 0, i * 2, i * 5) Next For i = 1 To 8 cube = CreateCube(ppfps_level) EntityType(cube, ppfps_SCENE) EntityPickMode(cube, 2) EntityColor(cube,100,100,100) PositionEntity(cube, 0, i * 2, i * -5) Next EntityType(ppfps_level,ppfps_SCENE) ppfps_lightPivot = CreatePivot() NameEntity(ppfps_lightPivot,"Light Pivot") light = CreateLight(3,ppfps_lightPivot) NameEntity(light, "light1") PositionEntity(light,25, 25, 0) RotateEntity(light, 90, 0, 0) LightRange(light, 500) LightColor(light, 255, 0, 0) light = CreateLight(3,ppfps_lightPivot) NameEntity(light, "light2") PositionEntity(light,-25, 25, 0) RotateEntity(light, 90, 0, 0) LightRange(light, 500) LightColor(light, 0, 0, 255) light = CreateLight(3,ppfps_lightPivot) NameEntity(light, "light3") PositionEntity(light,0, 25, 25) RotateEntity(light, 90, 0, 0) LightRange(light, 500) LightColor(light, 0, 255, 0) End Function ;=========================================================================== ;====== FPSNET TEXT ======================================================== Function ppfps_FPSNetText(ppfps_fontType, X, Y, theText$, centerX = 0, centerY = 0,r = 255, g = 255, b = 255) Color(r, g, b) SetFont(ppfps_fontType) Text(ppfps_CorrectX(X), ppfps_CorrectY(Y), theText$, centerX, centerY) End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ppfps_LineOfSight3D() ; ; Usage: ; observer = Entity that is looking ; target = Entity that the observer is looking for ; viewrange = How far can the observer see (in units) ; viewangle = How wide is the view of the observer (in degrees) ; ; Created by Mikkel Fredborg - Use as you please ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function ppfps_LineOfSight3D(observer,target,viewrange#=10.0,viewangle# = 90.0) ;distance between observer and target Local dist# = EntityDistance(observer,target) ;check if the target is within viewrange If dist<=viewrange ;observer vector TFormVector 0,0,1,observer,0 Local ox# = TFormedX() Local oy# = TFormedY() Local oz# = TFormedZ() ;pick vector Local dx# = (EntityX(target,True)-EntityX(observer,True))/dist# Local dy# = (EntityY(target,True)-EntityY(observer,True))/dist# Local dz# = (EntityZ(target,True)-EntityZ(observer,True))/dist# ;dot product Local dot# = ox*dx + oy*dy + oz*dz ;check if the target is within the viewangle If dot => Cos(viewangle/2.0) ; check if something is blocking the view If LinePick(EntityX(observer,True),EntityY(observer,True),EntityZ(observer,True),dx*viewrange,dy*viewrange,dz*viewrange,0.01)=target ; observer can see target so shoot the m'fucker Return True End If End If End If ; observer cannot see target Return False End Function Function ppfps_curvevalue#(ppfps_NEWvalue#,oldvalue#,increments# ) If increments>1 Then oldvalue#=oldvalue#-(oldvalue#-ppfps_NEWvalue#)/increments If increments<=1 Then oldvalue=ppfps_NEWvalue Return oldvalue# End Function ;------------------------------------------------------- ; function to move one angle to another with acceleration ;------------------------------------------------------- Function ppfps_curveangle#( ppfps_NEWangle#,oldangle#,increments#) If increments>1 If (oldangle+360)-ppfps_NEWangle<ppfps_NEWANGLE-ppfps_OLDANGLE Then ppfps_OLDANGLE=360+ppfps_OLDANGLE If (ppfps_NEWangle+360)-oldangle<ppfps_OLDANGLE-ppfps_NEWANGLE Then ppfps_NEWANGLE=360+ppfps_NEWANGLE oldangle=oldangle-(oldangle-ppfps_NEWangle)/increments EndIf If increments<=1 oldangle=ppfps_NEWangle Return oldangle End Function ;========================================================================== ;====== CORRECTX ========================================================== Function ppfps_CorrectX(pixel) Return (pixel * GraphicsWidth() / 640) End Function ;========================================================================== ;====== CORRECTY ========================================================== Function ppfps_CorrectY(pixel) Return (pixel * GraphicsHeight() / 480) End Function ;========================================================================== ;====== DECODE INCOMING MESSAGE =========================================== Function ppfps_DecodeIncomingMessage(message$) For i = 1 To 100 ppfps_incoming$(i) = "" Next i = 1 part = 1 ppfps_incoming$(part) = Mid(message$, i, 1) i = i + 1 While Mid(message$, i, 1)<>"-" While Mid(message$, i, 1)<>"," ppfps_incoming$(part)=ppfps_incoming$(part)+Mid(message$, i, 1) i = i + 1 If Mid(message$, i, 1)="-" Exit EndIf Wend If Mid(message$, i, 1)="," i = i + 1 part = part + 1 ppfps_incoming$(part) = Mid(message$, i, 1) i = i + 1 EndIf Wend End Function ;========================================================================== ;====== ENTER CHAT ======================================================== Function ppfps_EnterChat() For i = 1 To 237 If (i >= 2 And i <= 11) Or (i >= 16 And i <= 25) Or (i >= 30 And i <= 38) Or (i >= 44 And i <= 50) If KeyHit(i) If Len(ppfps_chat$) <= 25 ppfps_chat$ = ppfps_chat$ + ppfps_keys$(i) EndIf EndIf EndIf Next If KeyHit(14) And Len(ppfps_chat$) >= 1 And keytimer# + 100 < MilliSecs() ppfps_chat$ = Left(ppfps_chat$,Len(ppfps_chat$) - 1) keytimer# = MilliSecs() EndIf If KeyHit(211) And Len(ppfps_chat$) >= 1 And keytimer# + 100 < MilliSecs() ppfps_chat$ = Right(ppfps_chat$,Len(ppfps_chat$) - 1) keytimer# = MilliSecs() EndIf If KeyHit(57) And Len(ppfps_chat$) <= 25 And keytimer# + 100 < MilliSecs() ppfps_chat$ = ppfps_chat$ + " " keytimer# = MilliSecs() EndIf If KeyHit(53) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "?" EndIf If KeyHit(2) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "!" EndIf If KeyHit(3) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "@" EndIf If KeyHit(4) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "#" EndIf If KeyHit(5) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "$" EndIf If KeyHit(6) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "%" EndIf If KeyHit(7) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "^" EndIf If KeyHit(8) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "&" EndIf If KeyHit(9) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "*" EndIf If KeyHit(10) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + "(" EndIf If KeyHit(11) And Len(ppfps_chat$) <= 25 And (KeyDown(42) Or KeyDown(54)) ppfps_chat$ = ppfps_chat$ + ")" EndIf If KeyHit(12 |
Engine Source