From f9ca0b52f95fd0bbee3b8d7f7a4d660d8eb83a15 Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Mon, 17 Jul 2017 23:07:50 -0400 Subject: [PATCH] v22337 (04/13/01): **SIEGE GAMEPLAY CHANGE**: When attacking a base, you will see red waypoints on the generators. When those generators are destroyed, the waypoints will change to green. If the generators are repaired thereafter, they will return to red. If you are on the defender team, these colors are reversed (green normally, red if destroyed, green if repaired again). This will help teams coordinate attack and defense more easily. **FLARE GREANDE GAMEPLAY CHANGE**: Each flare will only attract ONE missile now. When the missile hits the flare, the flare will be destroyed. Only the first missile fired after the flare is thrown will be fooled by that flare. Other missiles must be attracted by other flares in order to be avoided. *There was a problem where emails were getting cloned multiple times for some folks. This is fixed now and no longer occurs. *There was an issue where the single player game type was not being properly cleared for folks when they left single player and went to other games. This is fixed now. *A stray underground generator was removed from Caldera. *The name column will no longer jump to the top when folks leave and join a room, thus making it easier to stay focused on a particular player's name. *If you steal a vehicle, the vehicle's sensor radius will not switch to the stealing player's team. In otherwords, the sensor of the vehicle will still report to the original team's sensor net...not the team that stole the vehicle. That's as design and is one of the drawbacks of using a stolen vehicle. *Bounty & Hunter: The player icons on the command maps are now the correct colors. *More items have correct names and tags on the command map and in the HUD. There were instances like "East Generator Generator". Those have been eliminated. *The last patch accidentally eliminated the "PlayerXXX joined YYYY game. Click here to join." links from the CHAT. This has been resolved and is now available again. *Players are no longer able to squeeze in under the tires of vehicles and play Superman by lifting them off the ground. ; ) *Bots were getting stuck in Riverdance when the fell in the water near the bridge. This has been fixed. *Added more filtering options so that the filters for the server query (JOIN) screen are more powerful and flexible. *Added a Linux indicator so users can tell whether they are joining a Win32 or Linux server. (Shouldn't make any difference to game play, but we felt you'd like to know.) *Fixed a small texture leak on 3Space objects. *Added an underwater satchel charge effect. Slightly increased the delay time between activating the satchel and the time that it actually explodes (this was as designed...a minor bug was causing it to explode too soon). --- SierraUp.cfg | 2 +- base/gui/FilterEditDlg.gui | 222 +++++++++++----- base/gui/JoinChatDlg.gui | 2 +- base/gui/LobbyGui.gui | 2 +- base/gui/OptionsDlg.gui | 22 +- base/gui/guiProfiles.cs | 2 +- base/input.log | 2 +- base/missions/Alcatraz.mis | 12 +- base/missions/BeggarsRun.mis | 2 +- base/missions/Caldera.mis | 52 +--- base/missions/Desiccator.mis | 4 +- base/missions/Gauntlet.mis | 68 +---- base/missions/IceBound.mis | 25 +- base/missions/Masada.mis | 30 +-- base/missions/MyrkWood.mis | 8 +- base/missions/Respite.mis | 54 +--- base/missions/Training2.mis | 8 +- base/missions/UltimaThule.mis | 52 +--- base/scripts/ChatGui.cs | 40 ++- base/scripts/ChooseFilterDlg.cs | 60 ++++- base/scripts/CnHGame.cs | 12 +- base/scripts/GameGui.cs | 31 ++- base/scripts/OptionsDlg.cs | 67 +++-- base/scripts/SiegeGame.cs | 96 ++++++- base/scripts/SinglePlayerGame.cs | 26 +- base/scripts/Training1.cs | 76 +++--- base/scripts/clientDefaults.cs | 12 +- base/scripts/creditsText.cs | 11 +- base/scripts/deployables.cs | 2 +- base/scripts/inventory.cs | 114 ++++----- base/scripts/inventoryHud.cs | 2 +- base/scripts/packs/repairpack.cs | 2 +- base/scripts/packs/satchelCharge.cs | 362 ++++++++++++++++++++++----- base/scripts/projectiles.cs | 2 - base/scripts/server.cs | 30 ++- base/scripts/serverDefaults.cs | 2 + base/scripts/station.cs | 2 +- base/scripts/vehicles/vehicle.cs | 9 +- base/scripts/vehicles/vehicle_mpb.cs | 8 +- base/scripts/voiceChat.cs | 10 +- base/scripts/webbrowser.cs | 18 +- base/scripts/webemail.cs | 24 +- base/scripts/webforums.cs | 41 +-- base/scripts/weblinks.cs | 13 +- base/scripts/webnews.cs | 36 ++- base/scripts/webstuff.cs | 2 +- base/version.cs | 2 +- console_start.cs | 11 +- 48 files changed, 1067 insertions(+), 625 deletions(-) diff --git a/SierraUp.cfg b/SierraUp.cfg index 3509366..be377ea 100644 --- a/SierraUp.cfg +++ b/SierraUp.cfg @@ -1,7 +1,7 @@ ProductName "Tribes2" DisplayName "Tribes 2" PatchFolder .\patch -CurrentVersion 0.22228.0.0 +CurrentVersion 0.22337.0.0 AutoStart MonitorPatch LaunchExe "tribes2.exe" diff --git a/base/gui/FilterEditDlg.gui b/base/gui/FilterEditDlg.gui index f23e5ae..f1b8d26 100644 --- a/base/gui/FilterEditDlg.gui +++ b/base/gui/FilterEditDlg.gui @@ -19,6 +19,7 @@ new GuiControl(FilterEditDlg) { visible = "1"; helpTag = "0"; text = "EDIT GAME FILTER"; + maxLength = "255"; noTitleBar = "0"; new GuiTextCtrl() { @@ -31,6 +32,7 @@ new GuiControl(FilterEditDlg) { visible = "1"; helpTag = "0"; text = "Filter Name:"; + maxLength = "255"; }; new ShellTextEditCtrl(FilterEditName) { profile = "NewTextEditProfile"; @@ -42,8 +44,8 @@ new GuiControl(FilterEditDlg) { visible = "1"; helpTag = "0"; text = "New Filter"; - historySize = "0"; maxLength = "16"; + historySize = "0"; password = "0"; glowOffset = "9 9"; }; @@ -51,67 +53,73 @@ new GuiControl(FilterEditDlg) { profile = "ShellTextRightProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "53 78"; - extent = "100 22"; + position = "26 78"; + extent = "60 22"; minExtent = "8 8"; visible = "1"; helpTag = "0"; text = "Rules Set:"; + maxLength = "255"; }; new GuiTextCtrl() { profile = "ShellTextRightProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "53 108"; - extent = "100 22"; + position = "26 108"; + extent = "60 22"; minExtent = "8 8"; visible = "1"; helpTag = "0"; text = "Game Type:"; + maxLength = "255"; }; new GuiTextCtrl() { profile = "ShellTextRightProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "326 78"; + position = "239 78"; extent = "106 22"; minExtent = "8 8"; visible = "1"; helpTag = "0"; text = "Min Player Count:"; + maxLength = "255"; }; new GuiTextCtrl() { profile = "ShellTextRightProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "326 108"; + position = "239 108"; extent = "106 22"; minExtent = "8 8"; visible = "1"; helpTag = "0"; text = "Max Player Count:"; + maxLength = "255"; }; new GuiTextCtrl() { profile = "ShellTextProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "111 197"; + position = "42 230"; extent = "82 22"; minExtent = "8 8"; visible = "1"; helpTag = "0"; text = "Server Location:"; + maxLength = "255"; }; new ShellPopupMenu(FilterEditGameType) { profile = "ShellPopupProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "150 69"; - extent = "150 36"; + position = "83 69"; + extent = "160 36"; minExtent = "49 36"; visible = "1"; helpTag = "0"; text = "Any"; + maxLength = "255"; maxPopupHeight = "200"; buttonBitmap = "gui/shll_pulldown"; rolloverBarBitmap = "gui/shll_pulldownbar_rol"; @@ -122,15 +130,43 @@ new GuiControl(FilterEditDlg) { profile = "NewTextEditNumericProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "428 70"; + position = "341 70"; extent = "80 38"; minExtent = "32 38"; visible = "1"; helpTag = "0"; text = "0"; + maxLength = "3"; validate = "FilterEditDlg.setMinPlayers();"; historySize = "0"; + password = "0"; + glowOffset = "9 9"; + }; + new GuiTextCtrl() { + profile = "ShellTextRightProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "422 78"; + extent = "84 22"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + text = "Max Bot Count:"; + maxLength = "255"; + }; + new ShellTextEditCtrl(FilterEditMaxBots) { + profile = "NewTextEditNumericProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "502 70"; + extent = "80 38"; + minExtent = "32 38"; + visible = "1"; + helpTag = "0"; + text = "16"; maxLength = "3"; + validate = "FilterEditDlg.setMaxBots();"; + historySize = "0"; password = "0"; glowOffset = "9 9"; }; @@ -138,12 +174,13 @@ new GuiControl(FilterEditDlg) { profile = "ShellPopupProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "150 99"; - extent = "150 36"; + position = "83 99"; + extent = "160 36"; minExtent = "49 36"; visible = "1"; helpTag = "0"; text = "Any"; + maxLength = "255"; maxPopupHeight = "200"; buttonBitmap = "gui/shll_pulldown"; rolloverBarBitmap = "gui/shll_pulldownbar_rol"; @@ -154,15 +191,43 @@ new GuiControl(FilterEditDlg) { profile = "NewTextEditNumericProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "428 100"; + position = "341 100"; extent = "80 38"; minExtent = "32 38"; visible = "1"; helpTag = "0"; text = "255"; + maxLength = "3"; validate = "FilterEditDlg.setMaxPlayers();"; historySize = "0"; - maxLength = "3"; + password = "0"; + glowOffset = "9 9"; + }; + new GuiTextCtrl() { + profile = "ShellTextRightProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "422 108"; + extent = "84 22"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + text = "Min CPU Speed:"; + maxLength = "255"; + }; + new ShellTextEditCtrl(FilterEditMinCPU) { + profile = "NewTextEditNumericProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "502 100"; + extent = "80 38"; + minExtent = "32 38"; + visible = "1"; + helpTag = "0"; + text = "0"; + maxLength = "4"; + validate = "FilterEditDlg.setMinCPU();"; + historySize = "0"; password = "0"; glowOffset = "9 9"; }; @@ -170,100 +235,143 @@ new GuiControl(FilterEditDlg) { profile = "ShellRadioProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "108 155"; + position = "61 145"; extent = "165 27"; minExtent = "26 27"; visible = "1"; helpTag = "0"; text = "FILTER BY MAX PING"; + maxLength = "255"; }; new ShellTextEditCtrl(FilterEditMaxPing) { profile = "NewTextEditNumericProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "277 150"; + position = "230 140"; extent = "80 38"; minExtent = "32 38"; visible = "1"; helpTag = "0"; text = "0"; + maxLength = "3"; validate = "FilterEditDlg.setMaxPing();"; historySize = "0"; - maxLength = "3"; password = "0"; glowOffset = "9 9"; }; + new ShellToggleButton(FilterEditDedicatedTgl) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "336 145"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + helpTag = "0"; + text = "DEDICATED"; + maxLength = "255"; + }; + new ShellToggleButton(FilterEditNoPwdTgl) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "336 175"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + helpTag = "0"; + text = "NOT PASSWORDED"; + maxLength = "255"; + }; + new ShellToggleButton(FilterEditCurVersionTgl) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "336 205"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + helpTag = "0"; + text = "CURRENT VERSION"; + maxLength = "255"; + }; new ShellToggleButton(FilterEditLocMask0) { profile = "ShellRadioProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "108 219"; + position = "38 252"; extent = "165 27"; minExtent = "26 27"; visible = "1"; command = "FilterEditDlg.checkRegionMasks( 0 );"; helpTag = "0"; text = "NORTH AMERICA EAST"; - }; - new ShellToggleButton(FilterEditLocMask3) { - profile = "ShellRadioProfile"; - horizSizing = "right"; - vertSizing = "bottom"; - position = "322 219"; - extent = "165 27"; - minExtent = "26 27"; - visible = "1"; - command = "FilterEditDlg.checkRegionMasks( 3 );"; - helpTag = "0"; - text = "AUSTRALIA"; - }; - new ShellToggleButton(FilterEditLocMask1) { - profile = "ShellRadioProfile"; - horizSizing = "right"; - vertSizing = "bottom"; - position = "108 247"; - extent = "165 27"; - minExtent = "26 27"; - visible = "1"; - command = "FilterEditDlg.checkRegionMasks( 1 );"; - helpTag = "0"; - text = "NORTH AMERICA WEST"; - }; - new ShellToggleButton(FilterEditLocMask4) { - profile = "ShellRadioProfile"; - horizSizing = "right"; - vertSizing = "bottom"; - position = "322 247"; - extent = "165 27"; - minExtent = "26 27"; - visible = "1"; - command = "FilterEditDlg.checkRegionMasks( 4 );"; - helpTag = "0"; - text = "ASIA"; + maxLength = "255"; }; new ShellToggleButton(FilterEditLocMask2) { profile = "ShellRadioProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "108 275"; + position = "217 252"; extent = "165 27"; minExtent = "26 27"; visible = "1"; command = "FilterEditDlg.checkRegionMasks( 2 );"; helpTag = "0"; text = "SOUTH AMERICA"; + maxLength = "255"; + }; + new ShellToggleButton(FilterEditLocMask3) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "396 252"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + command = "FilterEditDlg.checkRegionMasks( 3 );"; + helpTag = "0"; + text = "AUSTRALIA"; + maxLength = "255"; + }; + new ShellToggleButton(FilterEditLocMask1) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "38 280"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + command = "FilterEditDlg.checkRegionMasks( 1 );"; + helpTag = "0"; + text = "NORTH AMERICA WEST"; + maxLength = "255"; }; new ShellToggleButton(FilterEditLocMask5) { profile = "ShellRadioProfile"; horizSizing = "right"; vertSizing = "bottom"; - position = "322 275"; + position = "217 280"; extent = "165 27"; minExtent = "26 27"; visible = "1"; command = "FilterEditDlg.checkRegionMasks( 5 );"; helpTag = "0"; text = "EUROPE"; + maxLength = "255"; + }; + new ShellToggleButton(FilterEditLocMask4) { + profile = "ShellRadioProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "396 280"; + extent = "165 27"; + minExtent = "26 27"; + visible = "1"; + command = "FilterEditDlg.checkRegionMasks( 4 );"; + helpTag = "0"; + text = "ASIA"; + maxLength = "255"; }; new ShellBitmapButton() { profile = "ShellButtonProfile"; diff --git a/base/gui/JoinChatDlg.gui b/base/gui/JoinChatDlg.gui index dc5c702..39d34fc 100644 --- a/base/gui/JoinChatDlg.gui +++ b/base/gui/JoinChatDlg.gui @@ -73,7 +73,7 @@ new GuiControl(JoinChatDlg) { extent = "128 38"; minExtent = "32 38"; visible = "1"; - command = "Canvas.popDialog(JoinChatDlg); LaunchTabView.viewTab(\"Chat\",ChatGui,0);"; + command = "Canvas.popDialog(JoinChatDlg); LaunchTabView.viewTab(\"CHAT\",ChatGui,0);"; accelerator = "escape"; helpTag = "0"; text = "CANCEL"; diff --git a/base/gui/LobbyGui.gui b/base/gui/LobbyGui.gui index 6577e9b..e6f0a51 100644 --- a/base/gui/LobbyGui.gui +++ b/base/gui/LobbyGui.gui @@ -156,7 +156,7 @@ new GuiChunkedBitmapCtrl(LobbyGui) { minExtent = "8 20"; visible = "1"; helpTag = "0"; - startScrollRegion = "2 0"; + startScrollRegion = "4 0"; headerBitmap = "gui/server_tabs"; sortArrowBitmap = "gui/shll_sortarrow"; fieldBase = "gui/shll_field"; diff --git a/base/gui/OptionsDlg.gui b/base/gui/OptionsDlg.gui index e2d8913..09df1ea 100644 --- a/base/gui/OptionsDlg.gui +++ b/base/gui/OptionsDlg.gui @@ -1365,7 +1365,7 @@ new GuiControl(OptionsDlg) { minExtent = "8 8"; visible = "1"; helpTag = "0"; - text = "Voice Listen Quality:"; + text = "Voice Listen Codec(s):"; maxLength = "255"; }; new ShellPopupMenu(OP_VoiceListenMenu) { @@ -1373,7 +1373,7 @@ new GuiControl(OptionsDlg) { horizSizing = "right"; vertSizing = "bottom"; position = "183 87"; - extent = "169 36"; + extent = "129 36"; minExtent = "49 36"; visible = "1"; helpTag = "0"; @@ -1394,7 +1394,7 @@ new GuiControl(OptionsDlg) { minExtent = "8 8"; visible = "1"; helpTag = "0"; - text = "Voice Send Quality:"; + text = "Voice Send Codec:"; maxLength = "255"; }; new ShellPopupMenu(OP_VoiceSendMenu) { @@ -1402,7 +1402,7 @@ new GuiControl(OptionsDlg) { horizSizing = "right"; vertSizing = "bottom"; position = "183 117"; - extent = "169 36"; + extent = "129 36"; minExtent = "49 36"; visible = "1"; helpTag = "0"; @@ -1438,6 +1438,20 @@ new GuiControl(OptionsDlg) { text = "Voice Send Quality:"; maxLength = "255"; }; + new GuiMLTextCtrl(OP_VoiceCodecInfo) { + profile = "GuiDefaultProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "25 159"; + extent = "395 140"; + minExtent = "8 140"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "0"; + maxChars = "-1"; + deniedSound = "InputDeniedSound"; + }; }; new ShellFieldCtrl(OP_ControlsPane) { profile = "ShellFieldProfile"; diff --git a/base/gui/guiProfiles.cs b/base/gui/guiProfiles.cs index 7f2c6e5..ee61f7b 100644 --- a/base/gui/guiProfiles.cs +++ b/base/gui/guiProfiles.cs @@ -1607,7 +1607,7 @@ new GuiControlProfile ("GuiChannelVectorProfile") fontColors[6] = "77 253 95"; // team chat, spam protection message, client tasks fontColors[7] = "40 231 240"; // global chat fontColors[8] = "200 200 50 200"; // used in single player game - fontColors[9] = "0 255 255"; // action + fontColors[9] = "66 219 234"; autoSizeWidth = false; autoSizeHeight = true; }; diff --git a/base/input.log b/base/input.log index 211408b..da17c35 100644 --- a/base/input.log +++ b/base/input.log @@ -1,4 +1,4 @@ -Input log opened at Mon Apr 9 17:42:34 2001 +Input log opened at Sun Apr 15 10:48:48 2001 Operating System: WinNT version 5.0 diff --git a/base/missions/Alcatraz.mis b/base/missions/Alcatraz.mis index 91bd478..2076fb7 100644 --- a/base/missions/Alcatraz.mis +++ b/base/missions/Alcatraz.mis @@ -389,17 +389,6 @@ new SimGroup(MissionGroup) { }; new SimGroup(IslandBase) { - new WayPoint() { - position = "40.0495 -103.975 291.518"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Control Switch"; - team = "0"; - locked = "true"; - }; new StaticShape() { position = "40.0495 -103.975 291.518"; rotation = "1 0 0 0"; @@ -408,6 +397,7 @@ new SimGroup(MissionGroup) { lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new InteriorInstance() { position = "40 -104 277.557"; diff --git a/base/missions/BeggarsRun.mis b/base/missions/BeggarsRun.mis index a7187b5..d0ccd54 100644 --- a/base/missions/BeggarsRun.mis +++ b/base/missions/BeggarsRun.mis @@ -3225,7 +3225,7 @@ new SimGroup(MissionGroup) { rotation = "1 0 0 0"; scale = "1 1 1"; description = "AudioDefault3d"; - fileName = "fx/environment/cicadas.wav"; + fileName = "fx/environment/crickets_drygrass.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; diff --git a/base/missions/Caldera.mis b/base/missions/Caldera.mis index 83a31c7..28d1c30 100644 --- a/base/missions/Caldera.mis +++ b/base/missions/Caldera.mis @@ -135,7 +135,7 @@ new SimGroup(MissionGroup) { new SimGroup(Teams) { new SimGroup(Team1) { - + providesPower = true; new SimGroup(WBase) { new StaticShape() { @@ -200,6 +200,7 @@ new SimGroup(MissionGroup) { scoutVehicle = "Removed"; locked = "true"; AssaultVehicle = "Removed"; + needsObjectiveWaypoint = true; }; new InteriorInstance() { position = "-45.7829 -144.124 180.354"; @@ -210,16 +211,6 @@ new SimGroup(MissionGroup) { AudioProfile = "Universal_Base_Pulse_2"; locked = "true"; }; - new StaticShape() { - position = "67.61 -48.218 -207.508"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "GeneratorLarge"; - lockCount = "0"; - homingCount = "0"; - Target = "37"; - locked = "true"; - }; new InteriorInstance() { position = "-216.271 -235.459 148.4"; rotation = "0 0 1 63.0253"; @@ -265,18 +256,6 @@ new SimGroup(MissionGroup) { locked = "true"; originalBarrel = "PlasmaBarrelLarge"; }; - new WayPoint() { - position = "-211.497 -233.586 151.337"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - nameTag = "Vehicle Pad"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Vehicle Pad"; - team = "0"; - locked = "true"; - }; }; new SimGroup(spawnspheres) { @@ -388,18 +367,7 @@ new SimGroup(MissionGroup) { locked = "true"; name = "Tactical Generator"; scoreValue = "5"; - }; - new WayPoint() { - position = "172.84 20.1 219.825"; - rotation = "1 0 0 0"; - scale = "0.1 0.1 0.1"; - nameTag = "Tactical Generator"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Tactical Generator"; - team = "0"; - locked = "true"; + needsObjectiveWaypoint = true; }; }; new SimGroup(Stations) { @@ -426,6 +394,7 @@ new SimGroup(MissionGroup) { homingCount = "0"; Target = "48"; locked = "true"; + needsObjectiveWaypoint = true; }; new InteriorInstance() { position = "210.961 -2.7616 219.719"; @@ -448,18 +417,7 @@ new SimGroup(MissionGroup) { locked = "true"; name = "Primary Generator"; scoreValue = "5"; - }; - new WayPoint() { - position = "268.3 20 219.8"; - rotation = "1 0 0 0"; - scale = "0.1 0.1 0.1"; - nameTag = "Primary Generator"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Primary Generator"; - team = "0"; - locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape() { position = "182.86 -5.01 219.7"; diff --git a/base/missions/Desiccator.mis b/base/missions/Desiccator.mis index ff3455e..d12d1f9 100644 --- a/base/missions/Desiccator.mis +++ b/base/missions/Desiccator.mis @@ -1657,7 +1657,7 @@ new SimGroup(MissionGroup) { position = "641.802 118.866 134.47"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/cicadas.wav"; + fileName = "fx/environment/crickets_drygrass.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; @@ -1679,7 +1679,7 @@ new SimGroup(MissionGroup) { position = "-201.563 -1.4155 139.489"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/cicadas.wav"; + fileName = "fx/environment/crickets_drygrass.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; diff --git a/base/missions/Gauntlet.mis b/base/missions/Gauntlet.mis index e9c873c..f78c140 100644 --- a/base/missions/Gauntlet.mis +++ b/base/missions/Gauntlet.mis @@ -132,41 +132,45 @@ new SimGroup(MissionGroup) { position = "114.695 -236.202 71.1529"; rotation = "0 0 1 89.5639"; scale = "1 1 1"; - nameTag = "Bunker 1"; + nameTag = "Bunker 1"; dataBlock = "GeneratorLarge"; lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2generatorLarge2) { position = "201.307 -171.776 53.1292"; rotation = "0 0 -1 89.9544"; scale = "1 1 1"; - nameTag = "Bunker 2"; + nameTag = "Bunker 2"; dataBlock = "GeneratorLarge"; lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2generatorLarge3) { position = "220.274 -75.7459 47.4929"; rotation = "0 0 -1 89.9544"; scale = "1 1 1"; - nameTag = "Bunker 3"; + nameTag = "Bunker 3"; dataBlock = "GeneratorLarge"; lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2generatorLarge4) { position = "122.055 -68.2083 63.2656"; rotation = "0 0 1 89.5639"; scale = "1 1 1"; - nameTag = "Bunker 4"; + nameTag = "Bunker 4"; dataBlock = "GeneratorLarge"; lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new SimGroup(Bunker1) { @@ -418,61 +422,7 @@ new SimGroup(MissionGroup) { homingCount = "0"; scoreValue = "5"; locked = "true"; - }; - new WayPoint() { - position = "199.172 -171.42 96.1636"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Bunker 2"; - team = "0"; - locked = "true"; - }; - new WayPoint() { - position = "116.693 -235.964 113.659"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Bunker 1"; - team = "0"; - locked = "true"; - }; - new WayPoint() { - position = "218.486 -75.1646 90.4386"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Bunker 3"; - team = "0"; - locked = "true"; - }; - new WayPoint() { - position = "123.951 -67.938 106.075"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Bunker 4"; - team = "0"; - locked = "true"; - }; - new WayPoint() { - position = "187.809 11.6775 32.3547"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Main Switch"; - team = "0"; - locked = "true"; + needsObjectiveWaypoint = true; }; new SimGroup(AIObjectives) { diff --git a/base/missions/IceBound.mis b/base/missions/IceBound.mis index da3df0a..9a3b23b 100644 --- a/base/missions/IceBound.mis +++ b/base/missions/IceBound.mis @@ -187,6 +187,7 @@ new SimGroup(MissionGroup) { lockCount = "0"; homingCount = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2generatorLarge2) { position = "444.673 206.305 47.5003"; @@ -197,28 +198,7 @@ new SimGroup(MissionGroup) { lockCount = "0"; homingCount = "0"; locked = "true"; - }; - new WayPoint() { - position = "468.836 157.363 103.217"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Power Building"; - team = "0"; - locked = "true"; - }; - new WayPoint() { - position = "477.048 329.22 103.709"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Control Building"; - team = "0"; - locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2SensorLargePulse1) { position = "412.455 189.482 168.46"; @@ -242,6 +222,7 @@ new SimGroup(MissionGroup) { homingCount = "0"; scoreValue = "5"; locked = "true"; + needsObjectiveWaypoint = true; }; new ForceFieldBare() { position = "506.928 283.603 45.4741"; diff --git a/base/missions/Masada.mis b/base/missions/Masada.mis index 30bb50f..6d3615c 100644 --- a/base/missions/Masada.mis +++ b/base/missions/Masada.mis @@ -1024,28 +1024,6 @@ new SimGroup(MissionGroup) { new SimGroup(defense) { powerCount = "3"; - new WayPoint() { - position = "-5.4366 -45.1529 272.689"; - rotation = "-0 0 -1 42.9718"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Holdfast Generators"; - team = "2"; - locked = "true"; - }; - new WayPoint() { - position = "15.7295 83.0713 296.738"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Stronghold Generator"; - team = "2"; - locked = "true"; - }; new InteriorInstance() { position = "-15.5504 -20.6638 284.652"; rotation = "-0 0 -1 89.9543"; @@ -1092,7 +1070,7 @@ new SimGroup(MissionGroup) { Target = "42"; team = "2"; locked = "true"; - damageTimeMS = "694715"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2generatorLarge2) { position = "-6.7802 -43.0255 271.588"; @@ -1106,7 +1084,7 @@ new SimGroup(MissionGroup) { Target = "43"; team = "2"; locked = "true"; - damageTimeMS = "695007"; + needsObjectiveWaypoint = true; }; new Item() { position = "-14.7471 -32.7903 282.27"; @@ -1230,6 +1208,7 @@ new SimGroup(MissionGroup) { team = "2"; locked = "true"; damageTimeMS = "652863"; + needsObjectiveWaypoint = true; }; new Item() { position = "-11.0846 -30.0616 297.07"; @@ -1249,7 +1228,7 @@ new SimGroup(MissionGroup) { position = "-15.3318 -0.0208392 269.726"; rotation = "1 0 0 0"; scale = "1 1 1"; - nameTag = "Control Switch"; + nameTag = "Control"; dataBlock = "FlipFlop"; lockCount = "0"; homingCount = "0"; @@ -1257,6 +1236,7 @@ new SimGroup(MissionGroup) { team = "2"; locked = "true"; Projector = "0"; + needsObjectiveWaypoint = true; }; new ForceFieldBare() { position = "-15.6484 -12.6499 269.508"; diff --git a/base/missions/MyrkWood.mis b/base/missions/MyrkWood.mis index 6349a76..f900b9b 100644 --- a/base/missions/MyrkWood.mis +++ b/base/missions/MyrkWood.mis @@ -1469,7 +1469,7 @@ new SimGroup(MissionGroup) { position = "-123.276 28.4301 116.558"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/bird1.wav"; + fileName = "fx/environment/bird_echo2.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; @@ -1513,7 +1513,7 @@ new SimGroup(MissionGroup) { position = "-288.977 118.926 110.287"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/bird1.wav"; + fileName = "fx/environment/bird_echo3.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; @@ -1535,7 +1535,7 @@ new SimGroup(MissionGroup) { position = "-464.766 -25.1102 114.665"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/bird2.wav"; + fileName = "fx/environment/bird_echo4.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; @@ -1579,7 +1579,7 @@ new SimGroup(MissionGroup) { position = "-464.866 108.756 106.983"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/bird1.wav"; + fileName = "fx/environment/bird_echo1.wav"; useProfileDescription = "0"; outsideAmbient = "1"; volume = "1"; diff --git a/base/missions/Respite.mis b/base/missions/Respite.mis index a572e34..5e65542 100644 --- a/base/missions/Respite.mis +++ b/base/missions/Respite.mis @@ -410,7 +410,7 @@ new SimGroup(MissionGroup) { powerCount = "0"; new SimGroup(ObjAlpha) { - powerCount = "1"; + providesPower = true; new InteriorInstance() { position = "-202.509 -44.8018 107.6"; @@ -436,25 +436,11 @@ new SimGroup(MissionGroup) { team = "2"; locked = "true"; }; - new StaticShape(Team2generatorLarge1) { - position = "-208.471 -50.5374 91.9001"; - rotation = "0 0 -1 89.9544"; - scale = "1 1 1"; - nameTag = "East Stronghold"; - dataBlock = "GeneratorLarge"; - lockCount = "0"; - homingCount = "0"; - name = "East Bunker Generator"; - Target = "40"; - team = "2"; - scoreValue = "5"; - locked = "true"; - }; new StaticShape(Team2FlipFlop1) { position = "-202.729 -45.0803 97.5"; rotation = "1 0 0 0"; scale = "1 1 1"; - nameTag = "Control Switch"; + nameTag = "Control"; dataBlock = "FlipFlop"; lockCount = "0"; homingCount = "0"; @@ -462,6 +448,7 @@ new SimGroup(MissionGroup) { team = "2"; Projector = "0"; locked = "true"; + needsObjectiveWaypoint = true; }; }; new SimGroup(ObjBeta) { @@ -490,6 +477,7 @@ new SimGroup(MissionGroup) { team = "2"; scoreValue = "5"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2StationInventory1) { position = "-115.004 27.3879 132.533"; @@ -553,6 +541,7 @@ new SimGroup(MissionGroup) { team = "2"; scoreValue = "5"; locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape(Team2StationInventory3) { position = "-61.3169 -115.977 126.67"; @@ -590,39 +579,6 @@ new SimGroup(MissionGroup) { locked = "true"; }; }; - new WayPoint() { - position = "-64.5573 -106.805 125.669"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "South Base Generator"; - team = "2"; - locked = "true"; - }; - new WayPoint() { - position = "-104.34 26.2317 135.396"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "North Base Generator"; - team = "2"; - locked = "true"; - }; - new WayPoint() { - position = "-206.347 -48.8631 90.5829"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "West Tower"; - team = "2"; - locked = "true"; - }; }; new SimGroup(AIObjectives) { powerCount = "0"; diff --git a/base/missions/Training2.mis b/base/missions/Training2.mis index d7dd9a6..e7c9207 100644 --- a/base/missions/Training2.mis +++ b/base/missions/Training2.mis @@ -1387,7 +1387,7 @@ new SimGroup(MissionGroup) { position = "640.679 -507.778 104.063"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/sandpatter2. wav"; + fileName = "fx/environment/sandpatter1. wav"; useProfileDescription = "0"; outsideAmbient = "0"; volume = "1"; @@ -1408,7 +1408,7 @@ new SimGroup(MissionGroup) { position = "5.48026 2.36356 61.6817"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/sandpatter2.wav"; + fileName = "fx/environment/sandpatter1.wav"; useProfileDescription = "0"; outsideAmbient = "0"; volume = "1"; @@ -1450,7 +1450,7 @@ new SimGroup(MissionGroup) { position = "335.214 -315.084 70.6655"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/sandpatter2.wav"; + fileName = "fx/environment/sandpatter1.wav"; useProfileDescription = "0"; outsideAmbient = "0"; volume = "1"; @@ -1492,7 +1492,7 @@ new SimGroup(MissionGroup) { position = "904.258 -618.315 111.262"; rotation = "1 0 0 0"; scale = "1 1 1"; - fileName = "fx/environment/sandpatter2.wav"; + fileName = "fx/environment/sandpatter1.wav"; useProfileDescription = "0"; outsideAmbient = "0"; volume = "1"; diff --git a/base/missions/UltimaThule.mis b/base/missions/UltimaThule.mis index 1ad3674..cf19770 100644 --- a/base/missions/UltimaThule.mis +++ b/base/missions/UltimaThule.mis @@ -107,6 +107,7 @@ new SimGroup(MissionGroup) { name = "Sorth Entrance Generator"; Target = "33"; team = "1"; + needsObjectiveWaypoint = true; }; new StaticShape() { position = "40.62 -127.18 51.09"; @@ -120,6 +121,7 @@ new SimGroup(MissionGroup) { name = "East Generator"; Target = "34"; team = "1"; + needsObjectiveWaypoint = true; }; new Turret() { position = "-1.6 -288.306 120.594"; @@ -251,51 +253,20 @@ new SimGroup(MissionGroup) { name = "Great Hall Generator"; Target = "41"; team = "1"; - }; - new WayPoint() { - position = "34.89 -165.434 71.8233"; - rotation = "1 0 0 0"; - scale = "0.1 0.1 0.1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "Great Hall Generator"; - team = "1"; - locked = "true"; - }; - new WayPoint() { - position = "40.81 -129.263 50.1692"; - rotation = "1 0 0 0"; - scale = "0.1 0.1 0.1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "East Generator"; - team = "1"; - locked = "true"; - }; - new WayPoint() { - position = "40.03 -223.787 46.0142"; - rotation = "1 0 0 0"; - scale = "0.1 0.1 0.1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "South Entrance Generator"; - team = "1"; - locked = "true"; + needsObjectiveWaypoint = true; }; new StaticShape() { position = "31.6522 -165.653 51.15"; rotation = "1 0 0 0"; scale = "1 1 1"; - nameTag = "Control Switch"; + nameTag = "Control"; dataBlock = "FlipFlop"; lockCount = "0"; homingCount = "0"; locked = "true"; Target = "42"; team = "1"; + needsObjectiveWaypoint = true; }; new ForceFieldBare() { position = "25.7162 -158.946 50.9885"; @@ -493,6 +464,7 @@ new SimGroup(MissionGroup) { name = "NE Force Field Generator #1"; Target = "47"; team = "1"; + needsObjectiveWaypoint = true; }; new StaticShape() { position = "243.46 232.45 166.9"; @@ -506,6 +478,7 @@ new SimGroup(MissionGroup) { name = "NE Force Field Generator #2"; Target = "48"; team = "1"; + needsObjectiveWaypoint = true; }; new InteriorInstance() { position = "240.91 269.69 155.91"; @@ -543,17 +516,6 @@ new SimGroup(MissionGroup) { team = "1"; }; }; - new WayPoint() { - position = "239.74 221.29 169.23"; - rotation = "1 0 0 0"; - scale = "1 1 1"; - dataBlock = "WayPointMarker"; - lockCount = "0"; - homingCount = "0"; - name = "North Force Field Generator Bunker"; - team = "1"; - locked = "true"; - }; new Item() { position = "250.45 216.71 144.22"; rotation = "1 0 0 0"; diff --git a/base/scripts/ChatGui.cs b/base/scripts/ChatGui.cs index 8ec79e7..3f48bf9 100644 --- a/base/scripts/ChatGui.cs +++ b/base/scripts/ChatGui.cs @@ -41,7 +41,7 @@ $CHANNEL_NEW = 512; // Default messages (if gui is left blank) $DefaultChatAwayMessage = "Don't be alarmed. I'm going to step away from my computer."; $DefaultChatKickMessage = "Alright, you\'re outta here!"; -$DefaultChatBanMessage = "You, and three generations of your offspring, are banned from this channel."; +$DefaultChatBanMessage = "Get out. And stay out!"; //------------------------------------------------------------------------------ @@ -145,6 +145,7 @@ function ChatTabView::onSelect(%this,%obj,%name) if ($IRCClient::currentChannel == $IRCClient::attachedChannel) ChatGuiMessageVector.detach(); ChatGuiMessageVector.attach(%obj); + ChatGuiMessageVector.scrollToBottom(); $IRCClient::attachedChannel = %obj; } $IRCClient::currentChannel = %obj; @@ -786,7 +787,7 @@ function IRCClient::notify(%event) case IDIRC_SORT: %i = $IRCClient::currentChannel.findMember($IRCClient::people.getObject(0)); ChatEditChannelBtn.setVisible($IRCClient::currentChannel.getFlags(%i) & $PERSON_OPERATOR); - ChatRoomMemberList_rebuild($IRCClient::currentChannel); + ChatRoomMemberList_refresh($IRCClient::currentChannel); case IDIRC_PART: ChatRoomMemberList_refresh($IRCClient::currentChannel); case IDIRC_KICK: @@ -824,6 +825,7 @@ function IRCClient::notify(%event) //------------------------------------------------------------------------------ function IRCClient::statusMessage(%message) { + //error("IRCClient::statusMessage( "@%message@" )"); $IRCClient::channels.getObject(0).pushBackLine("[STATUS] " @ %message); } @@ -1370,6 +1372,9 @@ function IRCClient::relogin() //------------------------------------------------------------------------------ function IRCClient::send(%message) { + if($IRCEcho) + echo("IRC SEND:" @ %message); + $IRCClient::tcp.send(%message @ "\r\n"); } @@ -1377,7 +1382,7 @@ function IRCClient::send(%message) function IRCTCP::onLine(%this,%line) { if($IRCEcho) - echo("IRC " @ %line); + echo("IRC RECV:" @ %line); // HACK: Windows 2000 bug. We shouldn't need to do this! if ($IRCClient::state $= IDIRC_CONNECTING_SOCKET) IRCTCP::onConnected(%this); @@ -1614,6 +1619,7 @@ function IRCClient::onJoin(%prefix,%params) // this is a hack, the list isnt being rebuilt right away but it is if you give it a half second schedule(500, 0, chatRoomMemberList_rebuild); + //error("rebuilt by onJoin"); } IRCClient::connected(); } @@ -1942,7 +1948,7 @@ function IRCClient::onKick(%prefix,%params) } else { - IRCClient::newMessage($IRCClient::currentChannel,"Host " @ %host @ " kicks " @ IRCClient::taggedNick(%p) @ " out of the chat room, saying \"" @ %params @ "\""); + IRCClient::newMessage(%c, "Host " @ %host @ " kicks " @ IRCClient::taggedNick(%p) @ " out of the chat room, saying \"" @ %params @ "\""); IRCClient::notify(IDIRC_PART); } @@ -2199,7 +2205,7 @@ function IRCClient::censor(%str) //------------------------------------------------------------------------------ function IRCClient::onList(%prefix,%params) { -//error("IRCClient::onList( "@ %prefix @", "@ %params @")"); + //error("IRCClient::onList( "@ %prefix @", "@ %params @")"); //EXAMPLE: :StLouis.MO.US.UnderNet.org 322 homer128 #bmx 9 :BMX Rules! %params = nextToken(%params,nick," "); @@ -2309,6 +2315,7 @@ function IRCClient::onAway(%prefix,%params) //------------------------------------------------------------------------------ function IRCClient::onAction(%prefix,%params) { + //error("IRCClient::onAction( "@ %prefix @", "@ %params @")"); %msg = nextToken(%params,ch," :"); %c = IRCClient::findChannel(%ch,true); @@ -2436,7 +2443,8 @@ function IRCClient::onChannelBanned(%prefix,%params) nextToken(%channel,channel," "); IRCClient::connected(); - IRCClient::statusMessage("Cannot join " @ %channel @ ": you have been banned."); + //IRCClient::statusMessage("Cannot join " @ %channel @ ": you have been banned."); + MessageBoxOk("Banned", "Cannot join " @ IRCClient::displayChannel(%channel) @ ". You have been banned."); IRCClient::notify(IDIRC_BANNED_CH); } @@ -2446,6 +2454,7 @@ function IRCClient::onServerBanned(%prefix,%params) $IRCClient::state = $IDIRC_DISCONNECTED; IRCClient::statusMessage("You have been banned from this server."); + MessageBoxOk("Server Ban", "You have been banned from this server."); // IRCClient::notify(IDIRC_BANNED_SERVER); } @@ -2830,6 +2839,7 @@ function IRCClient::setSpectator(%nick) //------------------------------------------------------------------------------ function IRCClient::kick(%p,%msg) { + //error("IRCClient::kick( "@ %p @", "@ %msg@" )"); IRCClient::send("KICK" SPC $IRCClient::currentChannel.getName() SPC %p.displayName @ " :" @ %msg); } @@ -2968,19 +2978,29 @@ function IRCClient::onJoinServer(%mission,%server,%address,%mayprequire,%prequir } //------------------------------------------------------------------------------ -function IRCClient::onJoinGame(%address,%desc) + function IRCClient::onJoinGame(%address,%desc) { + //error("IRCClient::onJoinGame( "@ %address @", "@ %desc @" )"); + IRCClient::away("joined a game."); + + %me = $IRCClient::people.getObject(0); + if(%address $= %me.lastAddress) + return; + + %me.lastAddress = %address; + if (%address $= "") %msg = $pref::IRCClient::hostMsg; else %msg = "launched into " @ %desc @ "."; - IRCClient::away(%msg); + + //IRCClient::sendAction(%msg); + for (%i = 1; %i < $IRCClient::channels.getCount(); %i++) { %c = $IRCClient::channels.getObject(%i); if (!%c.private) - //IRCClient::send2(%msg,%c.getName()); - IRCClient::send("PRIVMSG " @ %c.getName() @ ":\x01ACTION " @ %msg @ "\x01"); + IRCClient::send("PRIVMSG " @ %c.getName() @ " :\x01ACTION " @ %msg @ "\x01"); } } diff --git a/base/scripts/ChooseFilterDlg.cs b/base/scripts/ChooseFilterDlg.cs index 34e26cc..ee44ad8 100644 --- a/base/scripts/ChooseFilterDlg.cs +++ b/base/scripts/ChooseFilterDlg.cs @@ -64,11 +64,28 @@ function ChooseFilterDlg::editFilter( %this ) %rowText = CF_FilterList.getRowTextById( %rowId ); %filterName = getField( %rowText, 0 ); %gameType = getField( %rowText, 1 ); + if ( %gameType $= "" ) + %gameType = "Any"; %misType = getField( %rowText, 2 ); + if ( %misType $= "" ) + %misType = "Any"; %minPlayers = getField( %rowText, 3 ); + if ( %minPlayers $= "" ) + %minPlayers = 0; %maxPlayers = getField( %rowText, 4 ); + if ( %maxPlayers $= "" ) + %maxPlayers = 255; %regionCode = getField( %rowText, 5 ); + if ( %regionCode $= "" ) + %regionCode = 4294967295; %maxPing = getField( %rowText, 6 ); + %maxBots = getField( %rowText, 7 ); + if ( %maxBots $= "" ) + %maxBots = 16; + %minCPU = getField( %rowText, 8 ); + if ( %minCPU $= "" ) + %minCPU = 0; + %flags = getField( %rowText, 9 ); FilterEditName.setValue( %filterName ); FilterEditMinPlayers.setValue( %minPlayers ); @@ -96,6 +113,12 @@ function ChooseFilterDlg::editFilter( %this ) FilterEditMaxPing.setVisible( true ); } + FilterEditMaxBots.setValue( %maxBots ); + FilterEditMinCPU.setValue( %minCPU ); + FilterEditDedicatedTgl.setValue( %flags & 1 ); + FilterEditNoPwdTgl.setValue( %flags & 2 ); + FilterEditCurVersionTgl.setValue( %flags & 128 ); + %this.editFilterIndex = %rowId; Canvas.pushDialog( FilterEditDlg ); } @@ -115,8 +138,14 @@ function ChooseFilterDlg::saveFilter( %this ) %regionCode |= ( 1 << %i ); } %maxPing = FilterEditUsePingTgl.getValue() ? FilterEditMaxPing.getValue() : 0; + %maxBots = FilterEditMaxBots.getValue(); + %minCPU = FilterEditMinCPU.getValue(); + %flags = FilterEditDedicatedTgl.getValue() + | ( FilterEditNoPwdTgl.getValue() << 1 ) + | ( FilterEditCurVersionTgl.getValue() << 7 ); %row = %filterName TAB %gameType TAB %misType - TAB %minPlayers TAB %maxPlayers TAB %regionCode TAB %maxPing; + TAB %minPlayers TAB %maxPlayers TAB %regionCode + TAB %maxPing TAB %maxBots TAB %minCPU TAB %flags; CF_FilterList.setRowById( %this.editFilterIndex, %row ); CF_FilterList.setSelectedById( %this.editFilterIndex ); @@ -209,7 +238,7 @@ function FilterEditDlg::setMaxPlayers( %this ) %newMax = 1; FilterEditMaxPlayers.setValue( %newMax ); } - if ( %newMax > 255 ) + else if ( %newMax > 255 ) { %newMax = 255; FilterEditMaxPlayers.setValue( %newMax ); @@ -223,6 +252,22 @@ function FilterEditDlg::setMaxPlayers( %this ) } } +//------------------------------------------------------------------------------ +function FilterEditDlg::setMaxBots( %this ) +{ + %newMax = FilterEditMaxBots.getValue(); + if ( %newMax < 0 ) + { + %newMax = 0; + FilterEditMaxBots.setValue( %newMax ); + } + else if ( %newMax > 16 ) + { + %newMax = 16; + FilterEditMaxBots.setValue( %newMax ); + } +} + //------------------------------------------------------------------------------ function FilterEditUsePingTgl::onAction( %this ) { @@ -240,6 +285,17 @@ function FilterEditDlg::setMaxPing( %this ) } } +//------------------------------------------------------------------------------ +function FilterEditDlg::setMinCPU( %this ) +{ + %newMin = FilterEditMinCPU.getValue(); + if ( %newMin < 0 ) + { + %newMin = 0; + FilterEditMinCPU.setValue( %newMin ); + } +} + //------------------------------------------------------------------------------ function clearGameTypes() { diff --git a/base/scripts/CnHGame.cs b/base/scripts/CnHGame.cs index 48953a5..632ff51 100644 --- a/base/scripts/CnHGame.cs +++ b/base/scripts/CnHGame.cs @@ -383,7 +383,7 @@ function CnHGame::genOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 Generator!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 Generator!', %repairman.name, %obj.nameTag); } } @@ -392,7 +392,7 @@ function CnHGame::stationOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 Inventory Station!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 Inventory Station!', %repairman.name, %obj.nameTag); } } @@ -401,16 +401,16 @@ function CnHGame::sensorOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 Pulse Sensor!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 Pulse Sensor!', %repairman.name, %obj.nameTag); } } function CnHGame::turretOnRepaired(%game, %obj, %objName) -{ +{ if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Turret!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Turret!', %repairman.name, %obj.nameTag); } } @@ -419,7 +419,7 @@ function CnHGame::vStationOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Vehicle Station!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Vehicle Station!', %repairman.name, %obj.nameTag); } } diff --git a/base/scripts/GameGui.cs b/base/scripts/GameGui.cs index 7502b9f..4d05ec1 100644 --- a/base/scripts/GameGui.cs +++ b/base/scripts/GameGui.cs @@ -277,15 +277,34 @@ function GMJ_Browser::runQuery( %this ) { %filter = $pref::ServerBrowser::Filter[%filterIndex]; GMJ_FilterText.setText( getField( %filter, 0 ) ); + %rulesSet = getField( %filter, 1 ); + if ( %rulesSet $= "" ) + %rulesSet = "any"; + %missionType = getField( %filter, 2 ); + if ( %missionType $= "" ) + %missionType = "any"; + %maxPlayers = getField( %filter, 4 ); + if ( %maxPlayers $= "" ) + %maxPlayers = 255; + %maxBots = getField( %filter, 7 ); + if ( %maxBots $= "" ) + %maxBots = 16; + %regionMask = getField( %filter, 5 ); + if ( %regionMask $= "" ) + %regionMask = 4294967295; + queryMasterServer( $JoinGamePort, 0, // Flags - getField( %filter, 1 ), // Rules Set - getField( %filter, 2 ), // Mission Type + %rulesSet, // Rules Set + %missionType, // Mission Type getField( %filter, 3 ), // Min Players - getField( %filter, 4 ), // Max Players - getField( %filter, 5 ), // Region Mask - getField( %filter, 6 ) ); // Max Ping + %maxPlayers, // Max Players + %maxBots, // Max Bots + %regionMask, // Region Mask + getField( %filter, 6 ), // Max Ping + getField( %filter, 8 ), // Min CPU Speed + getField( %filter, 9 ) ); // Filter flags GMJ_StopBtn.setActive( true ); } else @@ -329,7 +348,7 @@ function GMJ_Browser::onDatabaseRow( %this, %row, %isLastRow, %key ) if ( %isLastRow ) { GMJ_StatusText.setValue( "Querying the master server..." ); - queryMasterServer( $JoinGamePort, 0, "Any", "Any", 0, 255, 0xFFFFFFFF, 0, %this.buddyList ); + queryMasterServer( $JoinGamePort, 0, "Any", "Any", 0, 255, 16, 0xFFFFFFFF, 0, 0, %this.buddyList ); GMJ_StopBtn.setActive( true ); %this.buddyList = ""; } diff --git a/base/scripts/OptionsDlg.cs b/base/scripts/OptionsDlg.cs index d7d9d05..dfdd888 100644 --- a/base/scripts/OptionsDlg.cs +++ b/base/scripts/OptionsDlg.cs @@ -115,6 +115,21 @@ function OptionsDlg::onWake( %this ) OP_AudioBitRateMenu.init(); OP_AudioChannelsMenu.init(); + // don't allow changing of of mixer settings while in a game... + %active = !isObject(ServerConnection); + OP_AudioFrequencyMenu.setActive(%active); + // Changing these audio settings doesn't help Linux performance + if ( $platform $= "linux" ) { + OP_AudioBitRateMenu.setActive(false); + OP_AudioChannelsMenu.setActive(false); + } else { + OP_AudioBitRateMenu.setActive(%active); + OP_AudioChannelsMenu.setActive(%active); + } + OP_AudioProviderMenu.setActive(%active); + OP_AudioEnvironmentTgl.setActive(%active); + OP_AudioSpeakerMenu.setActive(%active); + OP_MasterVolumeSlider.setValue( $pref::Audio::masterVolume ); OP_EffectsVolumeSlider.setValue( $pref::Audio::effectsVolume ); OP_VoiceBindVolumeSlider.setValue( $pref::Audio::radioVolume ); @@ -128,6 +143,7 @@ function OptionsDlg::onWake( %this ) OP_InputBoostSlider.setValue( $pref::Audio::captureGainScale ); OP_VoiceListenMenu.init(); OP_VoiceSendMenu.init(); + OP_VoiceCodecInfo.init(); updateInputBoost(); // Initialize the Control Options controls: @@ -272,6 +288,12 @@ function OptionsDlg::onSleep( %this ) audioSetDriver( "none" ); audioSetDriver( $pref::Audio::activeDriver ); %this.resetAudio = ""; + + // Play the shell hum: (all sources are gone) + if($HudHandle['shellScreen'] $= "") + alxStop($HudHandle['shellScreen']); + + $HudHandle['shellScreen'] = alxPlay(ShellScreenHumSound, 0, 0, 0); } if ( isObject( ServerConnection ) && isTextureFlushRequired() ) @@ -1127,13 +1149,16 @@ function localCaptureStop( %method ) function OP_VoiceListenMenu::init( %this ) { %this.clear(); - %this.add( "Low", 1 ); - %this.add( "Medium", 3 ); - %this.add( "High", 7 ); + %this.add( "", 0 ); + %this.add( ".v12", 1 ); + %this.add( ".v12 - .v24", 3 ); + %this.add( ".v12 - .v29", 7 ); +// %this.add( ".v12 - .gsm", 15 ); switch ( $pref::Audio::decodingMask ) { - case 3 or 7: +// case 0 or 3 or 7 or 15: + case 0 or 3 or 7: %this.setSelected( $pref::Audio::decodingMask ); default: %this.setSelected( 1 ); @@ -1144,17 +1169,31 @@ function OP_VoiceListenMenu::init( %this ) function OP_VoiceSendMenu::init( %this ) { %this.clear(); - %this.add( "Low", 0 ); - %this.add( "Medium", 1 ); - %this.add( "High", 2 ); + %this.add( ".v12", 0 ); + %this.add( ".v24", 1 ); + %this.add( ".v29", 2 ); +// %this.add( ".gsm", 3 ); - switch ( $pref::Audio::encodingLevel ) - { - case 1 or 2: - %this.setSelected( $pref::Audio::encodingLevel ); - default: - %this.setSelected( 0 ); - } + %this.setSelected($pref::Audio::encodingLevel); +} + +function OP_VoiceCodecInfo::init( %this ) +{ + %headerStyle = ""; + %displayText = "" @ %headerStyle @ "Voice Codec Information:" NL + "\n" @ + " .v12: variable bitrate codec (~1.2 kbits/sec win)" NL + " .v24: fixed bitrate codec (2.4 kbits/sec win)" NL + " .v29: fixed bitrate codec (2.9 kbits/sec win)" NL +// " .gsm: fixed bitrate codec (6.6 kbits/sec win/linux)" NL + "\n" @ + "" @ + "Setting your codec levels too high can have adverse" @ + " affects on network performance." @ + ""; + + %this.setText(%displayText); + %this.setActive(false); } //------------------------------------------------------------------------------ diff --git a/base/scripts/SiegeGame.cs b/base/scripts/SiegeGame.cs index 9ff12e2..da1df0a 100644 --- a/base/scripts/SiegeGame.cs +++ b/base/scripts/SiegeGame.cs @@ -67,6 +67,22 @@ function FlipFlop::playerTouch(%data, %flipflop, %player) Game.allObjectivesCompleted(); } +//-------------------------------------------------------------------------------- +function StaticShapeData::onDisabled(%data, %obj, %prevState) +{ + Parent::onDisabled(%data, %obj, %prevState); + + if(%obj.waypoint) + game.switchWaypoint(%obj.waypoint); +} + +//-------------------------------------------------------------------------------- +function StaticShapeData::onEnabled(%data, %obj, %prevState) +{ + if(%obj.waypoint) + game.switchWaypoint(%obj.waypoint); +} + }; //--------- Siege SCORING INIT ------------------ @@ -137,6 +153,9 @@ function SiegeGame::missionLoadDone(%game) // save off turret bases' original barrels %game.checkTurretBases(); + // add objective waypoints + %game.findObjectiveWaypoints(); + MissionGroup.setupPositionMarkers(true); } @@ -388,6 +407,9 @@ function SiegeGame::halftime(%game, %reason) // start the mission again (release players) %game.halfTimeCountDown($Host::warmupTime); + + //redo the objective waypoints + %game.findObjectiveWaypoints(); } else { @@ -658,6 +680,68 @@ function ForceFieldBare::objectRestore(%this) // avoid console error spam } +// ------------------------------------------------------------------------ +// Waypoint managing + +function siegeGame::findObjectiveWaypoints(%game, %group) +{ + if(!%group) + %group = nameToId("MissionGroup/Teams"); + + for (%i = 0; %i < %group.getCount(); %i++) + { + %obj = %group.getObject(%i); + if(%obj.getClassName() $= SimGroup) + { + %game.findObjectiveWaypoints(%obj); + } + else if(%obj.needsObjectiveWaypoint) + { + %game.initializeWaypointAtObjective(%obj); + } + } +} + +function siegeGame::initializeWaypointAtObjective(%game, %object) +{ + // out with the old...jic + if(%object.waypoint) + %object.waypoint.delete(); + + if(%object.team == %game.offenseTeam) + %team = %game.offenseTeam; + else + %team = (%game.offenseTeam == 1 ? 2 : 1); + + // to make the waypoint look a little prettier we are using the z from + // position and the x and y from worldBoxCenter + %posX = getWord(%object.getWorldBoxCenter(), 0); + %posY = getWord(%object.getWorldBoxCenter(), 1); + %posZ = getWord(%object.position, 2); + + %append = getTaggedString(%object.getDataBlock().targetTypeTag); + + %object.waypoint = new WayPoint() { + position = %posX SPC %posY SPC %posZ; + rotation = "1 0 0 0"; + scale = "1 1 1"; + dataBlock = "WayPointMarker"; + team = %team; + name = %object.nameTag SPC %append; + }; + MissionCleanup.add(%object.waypoint); +} + +function siegeGame::switchWaypoint(%game, %waypoint) +{ + %team = %waypoint.team; + %newTeam = (%team == 1 ? 2 : 1); + + %waypoint.team = %newTeam; +} + + + function SiegeGame::gameOver(%game) { //call the default @@ -866,8 +950,8 @@ function SiegeGame::genOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 generator!', %repairman.name, %objName); - } + messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 generator!', %repairman.name, %obj.nameTag); + } } function SiegeGame::stationOnRepaired(%game, %obj, %objName) @@ -875,7 +959,7 @@ function SiegeGame::stationOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 inventory station!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 inventory station!', %repairman.name, %obj.nameTag); } } @@ -884,7 +968,7 @@ function SiegeGame::sensorOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 pulse sensor!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 pulse sensor!', %repairman.name, %obj.nameTag); } } @@ -893,7 +977,7 @@ function SiegeGame::turretOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 turret!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 turret!', %repairman.name, %obj.nameTag); } } @@ -902,7 +986,7 @@ function SiegeGame::vStationOnRepaired(%game, %obj, %objName) if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; - messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 vehicle station!', %repairman.name, %objName); + messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 vehicle station!', %repairman.name, %obj.nameTag); } } diff --git a/base/scripts/SinglePlayerGame.cs b/base/scripts/SinglePlayerGame.cs index ce6072a..3f2e3a6 100644 --- a/base/scripts/SinglePlayerGame.cs +++ b/base/scripts/SinglePlayerGame.cs @@ -555,15 +555,7 @@ function singlePlayerGame::gameOver(%game) //disable the AI system AISystemEnabled(false); - //Deactivate packages...gotta catch'm all - //deactivatepackage(SinglePlayer); - deactivatepackage(Training1); - deactivatepackage(Training2); - deactivatepackage(Training3); - deactivatepackage(Training4); - deactivatepackage(Training5); - deactivatepackage(Training6); - deactivatePackage(singlePlayerMissionAreaEnforce); + game.deactivatePackages(); if(isObject( $player.currentWaypoint )) $player.currentWaypoint.delete(); @@ -579,6 +571,22 @@ function singlePlayerGame::gameOver(%game) DefaultGame::GameOver(%game); } +function singlePlayerGame::deactivatePackages(%game) +{ + error("singlePlayerGame packages deactivated"); + //Deactivate packages...gotta catch'm all + //deactivatepackage(SinglePlayer); + deactivatepackage(Training1); + deactivatepackage(Training2); + deactivatepackage(Training3); + deactivatepackage(Training4); + deactivatepackage(Training5); + deactivatepackage(Training6); + deactivatePackage(singlePlayerMissionAreaEnforce); +} +//------------------------------------------------------------------------------------ + + // Voice line, text, function and audio parsing //================================================================================= // this is how we handle ALL the voice distribition and playing diff --git a/base/scripts/Training1.cs b/base/scripts/Training1.cs index 74b6a80..6773de8 100644 --- a/base/scripts/Training1.cs +++ b/base/scripts/Training1.cs @@ -824,42 +824,42 @@ function flashObjective() } //------------------------------------------------------------------------------ -function playCinematicSound(%sound) -{ - switch$(%sound) - { - case "MissileLock": - %file = "fx/weapons/missile_launcher_lock.wav"; - %looping = true; - - case "Heartbeat": - %file = "fx/misc/heartbeat.wav"; - %looping = false; - } - - %audiosound = new AudioEmitter() { - filename = %flie; - position = $player.player; - volume = "1"; - isLooping = %looping; - is3D = false; - type = "EffectAudioType"; - }; - $player.currentSound = %audiosound; -} - -function playCinematicMissileLockSound() -{ - %audiosound = new AudioEmitter() { - filename = "fx/weapons/missile_launcher_lock.wav"; - position = $player.player; - volume = "1"; - isLooping = "1"; - is3D = false; - type = "EffectAudioType"; - }; - $player.missileSound = %audiosound; -} +// function playCinematicSound(%sound) +// { +// switch$(%sound) +// { +// case "MissileLock": +// %file = "fx/weapons/missile_launcher_lock.wav"; +// %looping = true; +// +// case "Heartbeat": +// %file = "fx/misc/heartbeat.wav"; +// %looping = false; +// } +// +// %audiosound = new AudioEmitter() { +// filename = %flie; +// position = $player.player; +// volume = "1"; +// isLooping = %looping; +// is3D = false; +// type = "EffectAudioType"; +// }; +// $player.currentSound = %audiosound; +// } +// +// function playCinematicMissileLockSound() +// { +// %audiosound = new AudioEmitter() { +// filename = "fx/weapons/missile_launcher_lock.wav"; +// position = $player.player; +// volume = "1"; +// isLooping = "1"; +// is3D = false; +// type = "EffectAudioType"; +// }; +// $player.missileSound = %audiosound; +// } //------------------------------------------------------------------------------ @@ -1079,7 +1079,7 @@ function AITraining1Pilot::monitor(%task, %client) if (VectorDist(%dest2D, %pos2D) < 20) { - if(%group.getCount() > %task.locationIndex) { + if(%group.getCount() > %task.locationIndex + 1) { %task.locationIndex++; cinematicEvent(%task.locationIndex); } @@ -1130,7 +1130,7 @@ function cinematicEvent(%num) moveMap.push(); TrainingPacifistMap.push(); hideHudHack(true); - playCinematicSound("MissileLock"); + // playCinematicSound("MissileLock"); schedule(5700, 0, forcedCinematicPlayerDismount); schedule( 6100, game, cleanUpFlyer); //schedule( 8000, game, trainingIntroFlightEnd); diff --git a/base/scripts/clientDefaults.cs b/base/scripts/clientDefaults.cs index 57cc00f..774dbc2 100644 --- a/base/scripts/clientDefaults.cs +++ b/base/scripts/clientDefaults.cs @@ -1,12 +1,16 @@ $JoinGamePort = 28000; $pref::Audio::activeDriver = "default"; -$pref::Audio::drivers = "Miles"; +if ( $platform $= "linux" ) { + $pref::Audio::drivers = "OpenAL"; +} else { + $pref::Audio::drivers = "Miles"; +} $pref::Audio::frequency = 22100; $pref::Audio::sampleBits = 16; $pref::Audio::channels = 2; $pref::Audio::enableVoiceCapture = 1; -$pref::Audio::voiceChannels = 2; -$pref::Audio::encodingLevel = 0; +$pref::Audio::voiceChannels = 1; +$pref::Audio::encodingLevel = 0; $pref::Audio::decodingMask = 1; $pref::Audio::forceMaxDistanceUpdate = 0; $pref::Audio::environmentEnabled = 0; @@ -77,7 +81,7 @@ $pref::Input::KeyboardTurnSpeed = 0.1; $pref::Interior::TexturedFog = 0; $pref::IRCClient::autoreconnect = 1; $pref::IRCClient::awaymsg = "Don't be alarmed. I'm going to step away from my computer."; -$pref::IRCClient::banmsg = "You, and three generations of your offspring, are banned from this channel."; +$pref::IRCClient::banmsg = "Get out. And stay out!"; $pref::IRCClient::kickmsg = "Alright, you're outta here!"; $pref::IRCClient::hostmsg = "left to host a game."; $pref::IRCClient::showJoin = true; diff --git a/base/scripts/creditsText.cs b/base/scripts/creditsText.cs index 553668f..16d8337 100644 --- a/base/scripts/creditsText.cs +++ b/base/scripts/creditsText.cs @@ -96,9 +96,16 @@ addCreditsLine("Motion Ca addCreditsLine("Technical Director: Troy McFarland"); addCreditsLine("Performer: Cosmo Hom"); addCreditsLine(""); +addCreditsLine("Digital Video Support Team"); +addCreditsLine("Director: Jim\"zootboy\" Carey"); +addCreditsLine("Sage \"3Dkid\" Freeman"); +addCreditsLine("Steve \"opticNerve\" Bradford"); +addCreditsLine("Tonya \"Agentmoody\" Stumphauzer"); +addCreditsLine("Troy \"cann n fodder\" McFarland"); +addCreditsLine("Kate \"reelBoss\" Alley"); +addCreditsLine(""); addCreditsLine("Movie Intro"); -addCreditsLine("Robert Borth"); -addCreditsLine("Mike Price"); +addCreditsLine("PBDigital, Inc."); addCreditsLine(""); addCreditsLine("Installer"); addCreditsLine("Chris Mahnken"); diff --git a/base/scripts/deployables.cs b/base/scripts/deployables.cs index ed799ae..bdaae84 100644 --- a/base/scripts/deployables.cs +++ b/base/scripts/deployables.cs @@ -752,7 +752,7 @@ function ShapeBaseImageData::testInvalidDeployConditions(%item, %plyr, %slot) %disqualified = $NotDeployableReason::TurretTooClose; else if (%item.testTurretSaturation()) %disqualified = $NotDeployableReason::TurretSaturation; - else + else if (%disqualified == $NotDeployableReason::None) { // Test that there are no objstructing objects that this object // will intersect with diff --git a/base/scripts/inventory.cs b/base/scripts/inventory.cs index 563c1f0..7396056 100644 --- a/base/scripts/inventory.cs +++ b/base/scripts/inventory.cs @@ -61,14 +61,14 @@ function serverCmdThrowPack(%client,%data) function serverCmdTogglePack(%client,%data) { - // this function is apparently never called - %client.getControlObject().togglePack(); + // this function is apparently never called + %client.getControlObject().togglePack(); } function serverCmdThrowFlag(%client) { - //Game.playerDroppedFlag(%client.player); - Game.dropFlag(%client.player); + //Game.playerDroppedFlag(%client.player); + Game.dropFlag(%client.player); } function serverCmdSelectWeaponSlot( %client, %data ) @@ -83,37 +83,37 @@ function serverCmdCycleWeapon( %client, %data ) function serverCmdStartThrowCount(%client, %data) { - %client.player.throwStart = getSimTime(); + %client.player.throwStart = getSimTime(); } function serverCmdEndThrowCount(%client, %data) { - if(%client.player.throwStart == 0) - return; + if(%client.player.throwStart == 0) + return; - // throwStrength will be how many seconds the key was held - %throwStrength = (getSimTime() - %client.player.throwStart) / 300; - // trim the time to fit between 0.5 and 1.5 - if(%throwStrength > 1.5) - %throwStrength = 1.5; - else if(%throwStrength < 0.5) - %throwStrength = 0.5; + // throwStrength will be how many seconds the key was held + %throwStrength = (getSimTime() - %client.player.throwStart) / 300; + // trim the time to fit between 0.5 and 1.5 + if(%throwStrength > 1.5) + %throwStrength = 1.5; + else if(%throwStrength < 0.5) + %throwStrength = 0.5; - %throwScale = %throwStrength / 2; - %client.player.throwStrength = %throwScale; + %throwScale = %throwStrength / 2; + %client.player.throwStrength = %throwScale; - %client.player.throwStart = 0; + %client.player.throwStart = 0; } //---------------------------------------------------------------------------- function ShapeBase::throwWeapon(%this) { - if(Game.shapeThrowWeapon(%this)) { - %image = %this.getMountedImage($WeaponSlot); - %this.throw(%image.item); - %this.client.setWeaponsHudItem(%image.item, 0, 0); - } + if(Game.shapeThrowWeapon(%this)) { + %image = %this.getMountedImage($WeaponSlot); + %this.throw(%image.item); + %this.client.setWeaponsHudItem(%image.item, 0, 0); + } } function ShapeBase::throwPack(%this) @@ -139,12 +139,12 @@ function ShapeBase::throw(%this,%data) function ShapeBase::use(%this, %data) { - //if(%data.class $= "Weapon") { - // error("ShapeBase::use " @ %data); - //} + //if(%data.class $= "Weapon") { + // error("ShapeBase::use " @ %data); + //} if(%data $= Grenade) { - // figure out which grenade type you're using + // figure out which grenade type you're using for(%x = 0; $InvGrenade[%x] !$= ""; %x++) { if(%this.inv[$NameToInv[$InvGrenade[%x]]] > 0) { @@ -153,23 +153,25 @@ function ShapeBase::use(%this, %data) } } } - else if(%data $= "Backpack") { - %pack = %this.getMountedImage($BackpackSlot); - // if you don't have a pack but have placed a satchel charge, detonate it - if(!%pack && (%this.thrownChargeId > 0) && %this.thrownChargeId.armed ) + else if(%data $= "Backpack") { + %pack = %this.getMountedImage($BackpackSlot); + // if you don't have a pack but have placed a satchel charge, detonate it + if(!%pack && (%this.thrownChargeId > 0) && %this.thrownChargeId.armed ) { %this.playAudio( 0, SatchelChargeExplosionSound ); schedule( 800, %this, "detonateSatchelCharge", %this ); - return true; - } - } - else if(%data $= Beacon) + return true; + } + return false; + } + else if(%data $= Beacon) { %data.onUse(%this); if (%this.inv[%data.getName()] > 0) return true; } - // default case + + // default case if (%this.inv[%data.getName()] > 0) { %data.onUse(%this); return true; @@ -188,7 +190,7 @@ function ShapeBase::pickup(%this,%obj,%amount) function ShapeBase::hasInventory(%this, %data) { - // changed because it was preventing weapons cycling correctly (MES) + // changed because it was preventing weapons cycling correctly (MES) return (%this.inv[%data] > 0); } @@ -230,12 +232,12 @@ function ShapeBase::decInventory(%this,%data,%amount) function SimObject::decCatagory(%this) { - //function was added to reduce console err msg spam + //function was added to reduce console err msg spam } function SimObject::incCatagory(%this) { - //function was added to reduce console err msg spam + //function was added to reduce console err msg spam } function ShapeBase::setInventory(%this,%data,%value,%force) @@ -320,7 +322,7 @@ function ShapeBase::hasAmmo( %this, %weapon ) case GrenadeLauncher: return( %this.getInventory( GrenadeLauncherAmmo ) > 0 ); case SniperRifle: - return( %this.getInventory( EnergyPack ) ); + return( %this.getInventory( EnergyPack ) ); case ELFGun: return( true ); case Mortar: @@ -340,7 +342,7 @@ function ShapeBase::hasAmmo( %this, %weapon ) function SimObject::onInventory(%this, %obj) { - //function was added to reduce console error msg spam + //function was added to reduce console error msg spam } function ShapeBase::throwItem(%this,%data) @@ -358,7 +360,7 @@ function ShapeBase::throwObject(%this,%obj) //if the object is being thrown by a corpse, use a random vector if (%this.getState() $= "Dead") { - %vec = (-1.0 + getRandom() * 2.0) SPC (-1.0 + getRandom() * 2.0) SPC getRandom(); + %vec = (-1.0 + getRandom() * 2.0) SPC (-1.0 + getRandom() * 2.0) SPC getRandom(); %vec = vectorScale(%vec, 10); } @@ -379,10 +381,10 @@ function ShapeBase::throwObject(%this,%obj) %vec = vectorAdd(%vec,%this.getVelocity()); %pos = getBoxCenter(%this.getWorldBox()); - //since flags have a huge mass (so when you shoot them, they don't bounce too far) - //we need to up the %vec so that you can still throw them... - if (%obj.getDataBlock().getName() $= "Flag") - %vec = vectorScale(%vec, 40); + //since flags have a huge mass (so when you shoot them, they don't bounce too far) + //we need to up the %vec so that you can still throw them... + if (%obj.getDataBlock().getName() $= "Flag") + %vec = vectorScale(%vec, 40); // %obj.setTransform(%pos); @@ -391,8 +393,8 @@ function ShapeBase::throwObject(%this,%obj) %data = %obj.getDatablock(); %data.onThrow(%obj,%this); - //call the AI hook - AIThrowObject(%obj); + //call the AI hook + AIThrowObject(%obj); } function ShapeBase::clearInventory(%this) @@ -408,7 +410,7 @@ function ShapeBase::clearInventory(%this) %this.setInventory(FlashGrenade,0); %this.setInventory(ConcussionGrenade,0); %this.setInventory(FlareGrenade,0); - %this.setInventory(CameraGrenade, 0); + %this.setInventory(CameraGrenade, 0); %this.setInventory(Blaster,0); %this.setInventory(Plasma,0); @@ -428,12 +430,12 @@ function ShapeBase::clearInventory(%this) %this.setInventory(GrenadeLauncherAmmo, 0); %this.setInventory(MissileLauncherAmmo, 0); %this.setInventory(MortarAmmo, 0); - %this.setInventory(Beacon, 0); + %this.setInventory(Beacon, 0); - // take away any pack the player has - %curPack = %this.getMountedImage($BackpackSlot); - if(%curPack > 0) - %this.setInventory(%curPack.item, 0); + // take away any pack the player has + %curPack = %this.getMountedImage($BackpackSlot); + if(%curPack > 0) + %this.setInventory(%curPack.item, 0); } @@ -488,7 +490,7 @@ function ShapeBase::cycleWeapon( %this, %data ) && %this.hasInventory( %this.weaponSlot[%i] ) && %this.hasAmmo( %this.weaponSlot[%i] ) ) { - // player has this weapon and it has ammo or doesn't need ammo + // player has this weapon and it has ammo or doesn't need ammo %newSlot = %i; break; } @@ -539,7 +541,7 @@ function serverCmdGiveAll(%client) %player.setInventory(FlashGrenade,999); %player.setInventory(FlareGrenade,999); %player.setInventory(ConcussionGrenade,999); - %player.setInventory(CameraGrenade, 999); + %player.setInventory(CameraGrenade, 999); %player.setInventory(Blaster,1); %player.setInventory(Plasma,1); %player.setInventory(Chaingun, 1); @@ -557,6 +559,6 @@ function serverCmdGiveAll(%client) %player.setInventory(PlasmaAmmo,999); %player.setInventory(ChaingunAmmo, 999); %player.setInventory(DiscAmmo, 999); - %player.setInventory(Beacon, 999); + %player.setInventory(Beacon, 999); } } \ No newline at end of file diff --git a/base/scripts/inventoryHud.cs b/base/scripts/inventoryHud.cs index 9fea250..3272b2c 100644 --- a/base/scripts/inventoryHud.cs +++ b/base/scripts/inventoryHud.cs @@ -788,7 +788,7 @@ function addQuickPackFavorite( %pack, %item ) if(%item $= "") %item = "Pack"; %packFailMsg = "You cannot use that equipment with your selected loadout."; - if ( $Hud['inventoryScreen'].staticData[1, 1].getValue() $= "" ) + if ( !isObject($Hud['inventoryScreen'].staticData[1, 1]) || $Hud['inventoryScreen'].staticData[1, 1].getValue() $= "" ) { //if the player hasnt brought up the inv screen we use his current fav %currentFav = $pref::Favorite[$pref::FavCurrentSelect]; diff --git a/base/scripts/packs/repairpack.cs b/base/scripts/packs/repairpack.cs index 6794794..1de9c21 100644 --- a/base/scripts/packs/repairpack.cs +++ b/base/scripts/packs/repairpack.cs @@ -179,7 +179,7 @@ function RepairPackImage::onActivate(%data, %obj, %slot) return; } - if(%obj.getMountedImage($WeaponSlot).getName() !$= "RepairGunImage") + if(!isObject(%obj.getMountedImage($WeaponSlot)) || %obj.getMountedImage($WeaponSlot).getName() !$= "RepairGunImage") { messageClient(%obj.client, 'MsgRepairPackOn', '\c2Repair pack activated.'); diff --git a/base/scripts/packs/satchelCharge.cs b/base/scripts/packs/satchelCharge.cs index 9c102d4..14158dd 100644 --- a/base/scripts/packs/satchelCharge.cs +++ b/base/scripts/packs/satchelCharge.cs @@ -11,7 +11,7 @@ datablock AudioProfile(SatchelChargeActivateSound) { filename = "fx/packs/satchel_pack_activate.wav"; description = AudioClose3d; - preload = true; + preload = true; }; datablock AudioProfile(SatchelChargeExplosionSound) @@ -21,6 +21,20 @@ datablock AudioProfile(SatchelChargeExplosionSound) preload = true; }; +datablock AudioProfile(SatchelChargePreExplosionSound) +{ + filename = "fx/explosions/explosion.xpl03.wav"; + description = AudioBIGExplosion3d; + preload = true; +}; + +datablock AudioProfile(UnderwaterSatchelChargeExplosionSound) +{ + filename = "fx/weapons/mortar_explode_UW.wav"; + description = AudioBIGExplosion3d; + preload = true; +}; + //---------------------------------------------------------------------------- // Satchel Debris @@ -80,6 +94,48 @@ datablock DebrisData( SatchelDebris ) lifetimeVariance = 0.02; }; +//---------------------------------------------------------------------------- +// Bubbles +//---------------------------------------------------------------------------- +datablock ParticleData(SatchelBubbleParticle) +{ + dragCoefficient = 0.0; + gravityCoefficient = -0.25; + inheritedVelFactor = 0.0; + constantAcceleration = 0.0; + lifetimeMS = 1500; + lifetimeVarianceMS = 600; + useInvAlpha = false; + textureName = "special/bubbles"; + + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "0.7 0.8 1.0 0.0"; + colors[1] = "0.7 0.8 1.0 0.4"; + colors[2] = "0.7 0.8 1.0 0.0"; + sizes[0] = 2.0; + sizes[1] = 2.0; + sizes[2] = 2.0; + times[0] = 0.0; + times[1] = 0.8; + times[2] = 1.0; +}; +datablock ParticleEmitterData(SatchelBubbleEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 0; + ejectionVelocity = 1.0; + ejectionOffset = 7.0; + velocityVariance = 0.5; + thetaMin = 0; + thetaMax = 80; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + particles = "MortarExplosionBubbleParticle"; +}; + //-------------------------------------------------------------------------- // Satchel Explosion Particle effects //-------------------------------------- @@ -128,6 +184,52 @@ datablock ParticleEmitterData(SatchelExplosionSmokeEmitter) particles = "SatchelExplosionSmoke"; }; +datablock ParticleData(UnderwaterSatchelExplosionSmoke) +{ + dragCoeffiecient = 105.0; + gravityCoefficient = -0.0; + inheritedVelFactor = 0.025; + + constantAcceleration = -1.0; + + lifetimeMS = 1500; + lifetimeVarianceMS = 0; + + textureName = "particleTest"; + + useInvAlpha = false; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + textureName = "special/Smoke/smoke_001"; + + colors[0] = "0.4 0.4 1.0 1.0"; + colors[1] = "0.4 0.4 1.0 0.5"; + colors[2] = "0.0 0.0 0.0 0.0"; + sizes[0] = 7.0; + sizes[1] = 17.0; + sizes[2] = 2.0; + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + +}; + +datablock ParticleEmitterData(UnderwaterSatchelExplosionSmokeEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 0; + + ejectionVelocity = 14.25; + velocityVariance = 2.25; + + thetaMin = 0.0; + thetaMax = 180.0; + + lifetimeMS = 200; + + particles = "UnderwaterSatchelExplosionSmoke"; +}; datablock ParticleData(SatchelSparks) @@ -168,6 +270,43 @@ datablock ParticleEmitterData(SatchelSparksEmitter) particles = "SatchelSparks"; }; +datablock ParticleData(UnderwaterSatchelSparks) +{ + dragCoefficient = 1; + gravityCoefficient = 0.0; + inheritedVelFactor = 0.2; + constantAcceleration = 0.0; + lifetimeMS = 500; + lifetimeVarianceMS = 350; + textureName = "special/underwaterSpark"; + colors[0] = "0.6 0.6 1.0 1.0"; + colors[1] = "0.6 0.6 1.0 1.0"; + colors[2] = "0.6 0.6 1.0 0.0"; + sizes[0] = 0.5; + sizes[1] = 0.5; + sizes[2] = 0.75; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; + +}; + +datablock ParticleEmitterData(UnderwaterSatchelSparksEmitter) +{ + ejectionPeriodMS = 2; + periodVarianceMS = 0; + ejectionVelocity = 30; + velocityVariance = 5.0; + ejectionOffset = 0.0; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + overrideAdvances = false; + orientParticles = true; + lifetimeMS = 100; + particles = "UnderwaterSatchelSparks"; +}; //--------------------------------------------------------------------------- @@ -263,11 +402,103 @@ datablock ExplosionData(SatchelSubExplosion3) datablock ExplosionData(SatchelMainExplosion) { + soundProfile = SatchelChargePreExplosionSound; + subExplosion[0] = SatchelSubExplosion; subExplosion[1] = SatchelSubExplosion2; subExplosion[2] = SatchelSubExplosion3; }; +//--------------------------------------------------------------------------- +// Underwater Explosion +//--------------------------------------------------------------------------- + +datablock ExplosionData(UnderwaterSatchelSubExplosion) +{ + explosionShape = "disc_explosion.dts"; + faceViewer = true; + explosionScale = "0.5 0.5 0.5"; + + + lifetimeMS = 1000; + delayMS = 0; + + emitter[0] = UnderwaterSatchelExplosionSmokeEmitter; + emitter[1] = UnderwaterSatchelSparksEmitter; + emitter[2] = SatchelBubbleEmitter; + + offset = 0.0; + + playSpeed = 0.75; + + sizes[0] = "1.5 1.5 1.5"; + sizes[1] = "2.5 2.5 2.5"; + sizes[2] = "2.0 2.0 2.0"; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ExplosionData(UnderwaterSatchelSubExplosion2) +{ + explosionShape = "disc_explosion.dts"; + faceViewer = true; + explosionScale = "0.7 0.7 0.7"; + + + lifetimeMS = 1000; + delayMS = 50; + + emitter[0] = UnderwaterSatchelExplosionSmokeEmitter; + emitter[1] = UnderwaterSatchelSparksEmitter; + emitter[2] = SatchelBubbleEmitter; + + offset = 9.0; + + playSpeed = 0.75; + + sizes[0] = "1.5 1.5 1.5"; + sizes[1] = "1.0 1.0 1.0"; + sizes[2] = "0.75 0.75 0.75"; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ExplosionData(UnderwaterSatchelSubExplosion3) +{ + explosionShape = "disc_explosion.dts"; + faceViewer = true; + explosionScale = "1.0 1.0 1.0"; + + + lifetimeMS = 2000; + delayMS = 100; + + emitter[0] = UnderwaterSatchelExplosionSmokeEmitter; + emitter[1] = UnderwaterSatchelSparksEmitter; + emitter[2] = SatchelBubbleEmitter; + + offset = 9.0; + + playSpeed = 1.25; + + sizes[0] = "1.0 1.0 1.0"; + sizes[1] = "1.0 1.0 1.0"; + sizes[2] = "0.5 0.5 0.5"; + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ExplosionData(UnderwaterSatchelMainExplosion) +{ + soundProfile = UnderwaterSatchelChargeExplosionSound; + + subExplosion[0] = UnderwaterSatchelSubExplosion; + subExplosion[1] = UnderwaterSatchelSubExplosion2; + subExplosion[2] = UnderwaterSatchelSubExplosion3; +}; //-------------------------------------------------------------------------- @@ -295,7 +526,7 @@ datablock ItemData(SatchelCharge) friction = 0.6; pickupRadius = 2; rotate = true; - pickUpName = "a satchel charge pack"; + pickUpName = "a satchel charge pack"; computeCRC = true; }; @@ -304,13 +535,14 @@ datablock ItemData(SatchelChargeThrown) { shapeFile = "pack_upgrade_satchel.dts"; explosion = SatchelMainExplosion; + underwaterExplosion = UnderwaterSatchelMainExplosion; mass = 1.2; elasticity = 0.1; friction = 0.9; rotate = false; pickupRadius = 0; - noTimeout = true; - armDelay = 3000; + noTimeout = true; + armDelay = 3000; maxDamage = 0.6; kickBackStrength = 4000; @@ -327,45 +559,51 @@ function SatchelCharge::onUse(%this, %obj) rotation = "0 0 1 " @ (getRandom() * 360); }; MissionCleanup.add(%item); - // take pack out of inventory and unmount image - %obj.decInventory(SatchelCharge, 1); + // take pack out of inventory and unmount image + %obj.decInventory(SatchelCharge, 1); %obj.throwObject(%item); - //error("throwing satchel charge #" @ %item); + //error("throwing satchel charge #" @ %item); %obj.thrownChargeId = %item; %item.sourceObject = %obj; %item.armed = false; - %item.damaged = 0.0; - %item.thwart = false; - // arm itself 3 seconds after being thrown - schedule(%item.getDatablock().armDelay, %item, "armSatchelCharge", %item); + %item.damaged = 0.0; + %item.thwart = false; + // arm itself 3 seconds after being thrown + schedule(%item.getDatablock().armDelay, %item, "initArmSatchelCharge", %item); messageClient(%obj.client, 'MsgSatchelChargePlaced', "\c2Satchel charge deployed."); } +function initArmSatchelCharge(%satchel) +{ + // "deet deet deet" sound + %satchel.playAudio(1, SatchelChargeActivateSound); + // also need to play "antenna extending" animation + %satchel.playThread(0, "deploy"); + %satchel.playThread(1, "activate"); + + // delay the actual arming until after sound is done playing + schedule( 2200, 0, "armSatchelCharge", %satchel ); +} + function armSatchelCharge(%satchel) { - //error("satchel charge #" @ %satchel @ " armed!"); - %satchel.armed = true; - // "deet deet deet" sound - %satchel.playAudio(1, SatchelChargeActivateSound); - // also need to play "antenna extending" animation - %satchel.playThread(0, "deploy"); - %satchel.playThread(1, "activate"); + %satchel.armed = true; } function detonateSatchelCharge(%player) { - %satchelCharge = %player.thrownChargeId; - // can't detonate the satchel charge if it isn't armed - if(!%satchelCharge.armed) - return; + %satchelCharge = %player.thrownChargeId; + // can't detonate the satchel charge if it isn't armed + if(!%satchelCharge.armed) + return; - //error("Detonating satchel charge #" @ %satchelCharge @ " for player #" @ %player); + //error("Detonating satchel charge #" @ %satchelCharge @ " for player #" @ %player); if(%satchelCharge.getDamageState() !$= Destroyed) - %satchelCharge.setDamageState(Destroyed); + %satchelCharge.setDamageState(Destroyed); - if(isObject(%player)) - %player.thrownChargeId = 0; + if(isObject(%player)) + %player.thrownChargeId = 0; } function SatchelChargeThrown::onEnterLiquid(%data, %obj, %coverage, %type) @@ -391,7 +629,7 @@ function SatchelChargeThrown::onEnterLiquid(%data, %obj, %coverage, %type) function SatchelChargeImage::onMount(%data, %obj, %node) { - %obj.thrownChargeId = 0; + %obj.thrownChargeId = 0; } function SatchelChargeImage::onUnmount(%data, %obj, %node) @@ -400,34 +638,35 @@ function SatchelChargeImage::onUnmount(%data, %obj, %node) function SatchelChargeThrown::onDestroyed(%this, %object, %lastState) { - if(%object.kaboom) - return; - else - { - %object.kaboom = true; + if(%object.kaboom) + return; + else + { + %object.kaboom = true; - // the "thwart" flag is set if the charge is destroyed with weapons rather - // than detonated. A less damaging explosion, but visually the same scale. - if(%object.thwart) - { - %dmgRadius = 10; - %dmgMod = 0.3; - %expImpulse = 1000; - %dmgType = $DamageType::Explosion; - } - else - { - messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge detonated!"); - %dmgRadius = 20; - %dmgMod = 1.0; - %expImpulse = 2500; - %dmgType = $DamageType::SatchelCharge; - } + // the "thwart" flag is set if the charge is destroyed with weapons rather + // than detonated. A less damaging explosion, but visually the same scale. + if(%object.thwart) + { + %dmgRadius = 10; + %dmgMod = 0.3; + %expImpulse = 1000; + %dmgType = $DamageType::Explosion; + } + else + { + messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge detonated!"); + %dmgRadius = 20; + %dmgMod = 1.0; + %expImpulse = 2500; + %dmgType = $DamageType::SatchelCharge; + } - RadiusExplosion(%object, %object.getPosition(), %dmgRadius, %dmgMod, %expImpulse, %object.sourceObject, %dmgType); + %object.blowingUp = true; + RadiusExplosion(%object, %object.getPosition(), %dmgRadius, %dmgMod, %expImpulse, %object.sourceObject, %dmgType); - %object.schedule(500, "delete"); - } + %object.schedule(500, "delete"); + } } function SatchelChargeThrown::onCollision(%data,%obj,%col) @@ -436,17 +675,20 @@ function SatchelChargeThrown::onCollision(%data,%obj,%col) function SatchelChargeThrown::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) { - %targetObject.damaged += %amount; - - if(%targetObject.damaged >= %targetObject.getDataBlock().maxDamage && - %satchelCharge.getDamageState() !$= Destroyed) + if (!%object.blowingUp) { - %targetObject.thwart = true; - %targetObject.setDamageState(Destroyed); - } + %targetObject.damaged += %amount; + + if(%targetObject.damaged >= %targetObject.getDataBlock().maxDamage && + %targetObject.getDamageState() !$= Destroyed) + { + %targetObject.thwart = true; + %targetObject.setDamageState(Destroyed); + } + } } function SatchelCharge::onPickup(%this, %obj, %shape, %amount) { - // created to prevent console errors + // created to prevent console errors } \ No newline at end of file diff --git a/base/scripts/projectiles.cs b/base/scripts/projectiles.cs index b6610f9..d4013c1 100644 --- a/base/scripts/projectiles.cs +++ b/base/scripts/projectiles.cs @@ -460,9 +460,7 @@ function RadiusExplosion(%explosionSource, %position, %radius, %damage, %impulse { InitContainerRadiusSearch(%position, %radius, $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType | - $TypeMasks::MoveableObjectType | $TypeMasks::StaticShapeObjectType | - $TypeMasks::ForceFieldObjectType | $TypeMasks::TurretObjectType | $TypeMasks::ItemObjectType); diff --git a/base/scripts/server.cs b/base/scripts/server.cs index 9b89e90..59ed47b 100644 --- a/base/scripts/server.cs +++ b/base/scripts/server.cs @@ -8,7 +8,7 @@ $SB::DFDec = 0.02; // damageFlash function VerifyCDCheck(%func) { if (!cdFileCheck()) - messageBoxOkCancel("Tribes 2 CD Check", "You must have the Tribes 2 CD in the CD-ROM drive while playing offline. Please insert the CD.", "schedule(0, 0, VerifyCDCheck, " @ %func @ ");", "quit();"); + messageBoxOkCancel("TRIBES 2 CD CHECK", "You must have the Tribes 2 CD in the CD-ROM drive while playing Tribes 2. Please insert the CD.", "schedule(0, 0, VerifyCDCheck, " @ %func @ ");", "quit();"); else call(%func); } @@ -165,11 +165,13 @@ function DestroyServer() $missionRunning = false; allowConnections(false); stopHeartbeat(); - %game = game.class; MissionGroup.delete(); MissionCleanup.delete(); - %game.deactivatePackages(); - %game.delete(); + if(isObject(game)) + { + game.deactivatePackages(); + game.delete(); + } if(isObject($ServerGroup)) $ServerGroup.delete(); @@ -1472,12 +1474,30 @@ function isOnSuperAdminList(%client) function addToAdminList( %client ) { + %count = getRecordCount( $Host::AdminList ); + for ( %i = 0; %i < %count; %i++ ) + { + %id = getRecord( $Host::AdminList, %i ); + if ( %id == %client.guid ) + return; // They're already there! + } + + $Host::AdminList = $Host::AdminList NL %client.guid; } function addToSuperAdminList( %client ) { - + %count = getRecordCount( $Host::SuperAdminList ); + + for ( %i = 0; %i < %count; %i++ ) + { + %id = getRecord( $Host::SuperAdminList, %i ); + if ( %id == %client.guid ) + return; // They're already there! + } + + $Host::SuperAdminList = $Host::SuperAdminList NL %client.guid; } function resetTournamentPlayers() diff --git a/base/scripts/serverDefaults.cs b/base/scripts/serverDefaults.cs index f0c3629..dce4a8b 100644 --- a/base/scripts/serverDefaults.cs +++ b/base/scripts/serverDefaults.cs @@ -54,6 +54,8 @@ $Host::MaxMessageLen = 120; $MasterServerAddress = "IP:198.74.40.152:28000"; // 0: .v12 (1.2 kbits/sec), 1: .v24 (2.4 kbits/sec), 2: .v29 (2.9kbits/sec) +// 3: gsm (6.6 kbits/sec) +// GSM: $Audio::maxEncodingLevel = 3; $Audio::maxEncodingLevel = 2; $Audio::maxVoiceChannels = 2; diff --git a/base/scripts/station.cs b/base/scripts/station.cs index 71ae4fb..d72f73f 100644 --- a/base/scripts/station.cs +++ b/base/scripts/station.cs @@ -1226,7 +1226,7 @@ function checkSpawnPos(%MPB, %radius) %terrHeight = getTerrainHeight(%posX @ " " @ %posY); - if(abs(%terrHeight - %pPosZ) < %radius ) + if(mAbs(%terrHeight - %pPosZ) < %radius ) { %mask = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::StaticTSObjectType | diff --git a/base/scripts/vehicles/vehicle.cs b/base/scripts/vehicles/vehicle.cs index ad53435..f3bf68e 100644 --- a/base/scripts/vehicles/vehicle.cs +++ b/base/scripts/vehicles/vehicle.cs @@ -496,9 +496,12 @@ function MobileBaseVehicle::deleteAllMounted(%data, %obj) if(isObject(%obj.shield)) %obj.shield.delete(); - %obj.teleporter.setThreadDir($ActivateThread, FALSE); - %obj.teleporter.playThread($ActivateThread,"activate"); - %obj.teleporter.playAudio($ActivateSound, StationTeleportDeacitvateSound); + if (isObject(%obj.teleporter)) + { + %obj.teleporter.setThreadDir($ActivateThread, FALSE); + %obj.teleporter.playThread($ActivateThread,"activate"); + %obj.teleporter.playAudio($ActivateSound, StationTeleportDeacitvateSound); + } } //************************************************************** diff --git a/base/scripts/vehicles/vehicle_mpb.cs b/base/scripts/vehicles/vehicle_mpb.cs index d84e5c0..c519b8f 100644 --- a/base/scripts/vehicles/vehicle_mpb.cs +++ b/base/scripts/vehicles/vehicle_mpb.cs @@ -124,12 +124,12 @@ datablock WheeledVehicleData(MobileBaseVehicle) : MPBDamageProfile hardImpactSpeed = 25; // Play HardImpact Sound // Ground Impact Damage (uses DamageType::Ground) - minImpactSpeed = 25; - speedDamageScale = 0.220; + minImpactSpeed = 12; + speedDamageScale = 0.060; // Object Impact Damage (uses DamageType::Impact) - collDamageThresholdVel = 28; - collDamageMultiplier = 0.040; + collDamageThresholdVel = 12; + collDamageMultiplier = 0.080; // Engine engineTorque = 7.0 * 745; diff --git a/base/scripts/voiceChat.cs b/base/scripts/voiceChat.cs index 880946b..154f54c 100644 --- a/base/scripts/voiceChat.cs +++ b/base/scripts/voiceChat.cs @@ -5,7 +5,6 @@ $numTalking = 0; //------------------------------------------------------------------------------ function clientCmdPlayerStartTalking(%client, %success) { - //error("Client " @ %client @ " start talking, success = " @ %success); // if more people are talking than we can handle, don't bother with names if($numTalking > $voiceLines) return; @@ -45,8 +44,6 @@ function clientCmdPlayerStoppedTalking(%client, %success) } if(%doneLine != -1) %rmSuccess = removeVoiceLine(%doneLine); - //else - // error("Did not find voice line for client " @ %client); } //------------------------------------------------------------------------------ @@ -233,9 +230,10 @@ function voiceCapStart() { switch($Audio::serverEncodingLevel) { - case 0: %level = "Low"; - case 1: %level = "Medium"; - default: %level = "High"; + case 0: %level = "Codec .v12"; + case 1: %level = "Codec .v24"; + case 2: %level = "Codec .v29"; + default: %level = "Codec GSM"; } addMessageHudLine("\c2System:\cr server has voice level capped at [\c1" @ %level @ "\cr]."); diff --git a/base/scripts/webbrowser.cs b/base/scripts/webbrowser.cs index d29f76f..fd184fc 100644 --- a/base/scripts/webbrowser.cs +++ b/base/scripts/webbrowser.cs @@ -76,7 +76,7 @@ function BrowserStartSearch() //----------------------------------------------------------------------------- function ExecuteSearch(%id) { - DatabaseQueryArray(BrowserSearchPane.query,0,trim($BrowserSearchField) TAB 0 TAB 100 TAB 0, BrowserSearchPane, BrowserSearchPane.key); + DatabaseQueryArray(BrowserSearchPane.query,0,trim($BrowserSearchField) TAB 0 TAB 100 TAB 0, BrowserSearchPane, BrowserSearchPane.key, true); } //----------------------------------------------------------------------------- function getTribeMember(%tribeName) @@ -1372,12 +1372,12 @@ function TribePane::ButtonClick( %this, %senderid ) MemberList.addColumn( 0, "MEMBER", 92, 0, 100,"left"); MemberList.addColumn( 1, "TITLE", 90, 0, 100,"left"); MemberList.addColumn( 2, "RNK", 30, 0, 40, "numeric center" ); - TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,6,0,%tribeName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,6,0,%tribeName,%this,%this.key, true); case 2: //NEWS BUTTON %this.key = LaunchGui.key++; %this.state = "getTribeNews"; %this.tstate = "NEWS"; - TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,10,20,%tribeName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,10,20,%tribeName,%this,%this.key,true); case 3: //INVITE BUTTON MemberList.Clear(); MemberList.ClearColumns(); @@ -1388,7 +1388,7 @@ function TribePane::ButtonClick( %this, %senderid ) %this.tstate = "INVITES"; MemberList.addColumn( 0, "PLAYER", 100, 0, 350,"left" ); MemberList.addColumn( 1, "INVITED", 112, 0, 300, "left" ); - TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,11,0,%tribeName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500, 0, DatabaseQueryArray,11,0,%tribeName,%this,%this.key,true); case 4: //Admin Tribe if(trim(TWBText.getText()) !$= "") { @@ -1673,7 +1673,7 @@ function PlayerPane::ButtonClick( %this, %senderid ) %playerName = TWBTabView.getTabText(TWBTabView.GetSelectedID()); %callId = 3; - TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,12,0,%playerName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,12,0,%playerName,%this,%this.key,true); case 2: //TribeList W_MemberList.Clear(); W_MemberList.ClearColumns(); @@ -1684,7 +1684,7 @@ function PlayerPane::ButtonClick( %this, %senderid ) W_MemberList.addColumn( 1, "TITLE", 80, 0, 300 ); W_MemberList.addColumn( 2, "RNK", 38, 0, 50, "numeric center" ); %playerName = TWBTabView.getTabText(TWBTabView.GetSelectedID()); - TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,13,0,%playerName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,13,0,%playerName,%this,%this.key,true); case 3: //Player Buddylist W_MemberList.Clear(); W_MemberList.ClearColumns(); @@ -1695,14 +1695,14 @@ function PlayerPane::ButtonClick( %this, %senderid ) %this.key = LaunchGui.key++; %this.state = "getWarriorBuddyList"; %playerName = TWBTabView.getTabText(TWBTabView.GetSelectedID()); - TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,5,0,%playerName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQueryArray,5,0,%playerName,%this,%this.key,true); case 4: //Visitor Options W_Text.setValue(""); %this.state = "getVisitorOptions"; %owner = getField(getRecord(WonGetAuthInfo(),0),0); %playerName = TWBTabView.getTabText(TWBTabView.GetSelectedID()); TWBTitle.OldText = TWBTitle.name; - TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQuery,23,%playerName,%this,%this.key); + TribeAndWarriorBrowserGui.eid = schedule(500,0,DatabaseQuery,23,%playerName,%this,%this.key,true); case 5: //Admin Options if(trim(w_text.getText()) !$= "") { @@ -1828,8 +1828,6 @@ function WarriorPopup::onSelect( %this, %id, %text ) { case "T2 ADMINISTRATION": %tribe = "Game Feedback"; - case "T2 PRESSCORPS": - %tribe = "PRESSCORPS-Submissions"; } ForumsThreadPane.setVisible(false); ForumsTopicsPane.setVisible(true); diff --git a/base/scripts/webemail.cs b/base/scripts/webemail.cs index 714096d..deebe45 100644 --- a/base/scripts/webemail.cs +++ b/base/scripts/webemail.cs @@ -374,6 +374,8 @@ function CheckEmail(%calledFromSched) EmailGui.checkSchedule = ""; EMailGui.key = LaunchGui.key++; EmailGui.state = "getMail"; + EM_Browser.clear(); + EmailGui.LoadCache(); DatabaseQueryArray(1,0,$EmailNextSeq, EMailGui, EMailGui.key); EmailGui.checkingEmail = true; } @@ -765,7 +767,7 @@ function AddressDlg::GoSearch(%this) %this.key = LaunchGui.key++; %this.state = "goSearch"; %this.lbstate = "errorcheck"; - DatabaseQueryArray(3,100,trim(LC_Search.getValue()) TAB 0 TAB 100 TAB 1 ,%this, %this.key); + DatabaseQueryArray(3,100,trim(LC_Search.getValue()) TAB 0 TAB 100 TAB 1 ,%this, %this.key,true); LC_BuddyListBtn.direction = 0; LC_BuddyListBtn.text = "ADD TO BUDDYLIST"; LC_ListBox.setSelected(0); @@ -792,7 +794,7 @@ function AddressDlg::GoList(%this) else { %this.state = "getTribeMembers"; - DatabaseQueryArray(6,0,LC_ListBox.getValue(),%this,%this.key); + DatabaseQueryArray(6,0,LC_ListBox.getValue(),%this,%this.key,true); LC_BuddyListBtn.direction = 0; LC_BuddyListBtn.text = "ADD TO BUDDYLIST"; } @@ -932,7 +934,7 @@ function EmailGui::onWake(%this) if(!%this.cacheFile) { - %this.cacheFile = "email0"; + %this.cacheFile = "email1"; EmailGui.getCache(); } if ( !EmailGui.cacheLoaded || EM_Browser.rowCount() == 0 ) @@ -969,7 +971,7 @@ function EmailGui::ButtonClick(%this,%ord) EmailInboxBodyText.setText(""); EMailGui.state = "getDeletedMail"; EmailGui.key = LaunchGui.key++; - DatabaseQueryArray(14,100,EmailGui.state,EMailGui,EMailGui.key); + DatabaseQueryArray(14,100,EmailGui.state,EMailGui,EMailGui.key,true); } } //----------------------------------------------------------------------------- @@ -997,10 +999,8 @@ function EMailGui::onDatabaseQueryResult(%this, %status, %RowCount_Result, %key) EMailGui.getCache(); EMailGui.outputVector(); if(EMailGui.btnClicked) - { - MessageBoxOK("NOTICE","No New Mail"); EmailGui.btnClicked = false; - } + %this.checkingEmail = false; %this.checkSchedule = schedule(1000 * 60 * 5, 0, CheckEmail, true); // echo("scheduling Email check " @ %this.checkSchedule @ " in 5 minutes"); @@ -1121,7 +1121,7 @@ function EmailGui::getCache(%this) EM_Browser.clear(); EMailMessageVector.clear(); EmailInboxBodyText.setText(""); - %fileName = $EmailCachePath @ "email0"; + %fileName = $EmailCachePath @ "email1"; %file = new FileObject(); if ( %this.cacheFile $= "" ) { @@ -1131,7 +1131,7 @@ function EmailGui::getCache(%this) if ( %guid $= getField( WonGetAuthInfo(), 3 ) ) { // This is the right one! - %this.cacheFile = "email0"; + %this.cacheFile = "email1"; %this.messageCount = %file.readLine(); while( !%file.isEOF() ) { @@ -1176,7 +1176,7 @@ function EmailGui::loadCache( %this ) EM_Browser.clear(); EMailMessageVector.clear(); EMailInboxBodyText.setText(""); - %fileName = $EmailCachePath @ "email0"; + %fileName = $EmailCachePath @ "email1"; %file = new FileObject(); if ( %this.cacheFile $= "" ) { @@ -1186,7 +1186,7 @@ function EmailGui::loadCache( %this ) if ( %guid $= getField( WonGetAuthInfo(), 3 ) ) { // This is the right one! - %this.cacheFile = "email0"; + %this.cacheFile = "email1"; %this.messageCount = %file.readLine(); while( !%file.isEOF() ) { @@ -1219,7 +1219,7 @@ function EmailGui::loadCache( %this ) function EmailGui::dumpCache( %this ) { %guid = getField( WONGetAuthInfo(), 3 ); - if ( %this.cacheFile $= "" ) %this.cacheFile = "email0"; + if ( %this.cacheFile $= "" ) %this.cacheFile = "email1"; EmailMessageVector.dump( $EmailCachePath @ %this.cacheFile, %guid ); } //----------------------------------------------------------------------------- diff --git a/base/scripts/webforums.cs b/base/scripts/webforums.cs index b3e17c1..841796c 100644 --- a/base/scripts/webforums.cs +++ b/base/scripts/webforums.cs @@ -122,6 +122,17 @@ function DateStrCompare(%date1,%date2) return false; } //----------------------------------------------------------------------------- +function IsPostAuthor(%author) +{ +// %ai = wonGetAuthInfo(); +// %pid = getField(GetRecord(%ai,0), +// for(%east=0;%east ForumsMessageList.highestUpdate ) @@ -793,7 +800,9 @@ function ForumsGui::onDatabaseRow(%this,%row,%isLastRow,%key) if(ForumsMessageList.allRead && DateStrCompare(ForumsMessageList.lastDate,%date)) %text = setRecord( %text, 0, "1" ); - ForumsMessageVector.pushBackLine(%text, %postId); + if(!%isDeleted) + ForumsMessageVector.pushBackLine(%text, %postId); + if(%isLastRow) { ForumsMessageVector.tid = ForumsTopicsList.getSelectedID(); @@ -1381,4 +1390,4 @@ function ForumsMessagelist::onDatabaseQueryResult(%this,%status,%resultString,%k MessageBoxOK("ERROR",getFields(%status,1)); } canvas.SetCursor(DefaultCursor); -} +} \ No newline at end of file diff --git a/base/scripts/weblinks.cs b/base/scripts/weblinks.cs index c349a63..c0b3009 100644 --- a/base/scripts/weblinks.cs +++ b/base/scripts/weblinks.cs @@ -4,22 +4,27 @@ addWebLink( "5 Assed Monkey", "www.5assedmonkey.com" ); addWebLink( "BarrysWorld", "www.barrysworld.com" ); addWebLink( "Clan Happytyme", "www.happytyme.com" ); addWebLink( "ClanBase", "www.clanbase.com" ); +addWebLink( "ClanServ", "www.clanserv.com" ); addWebLink( "Dopplegangers", "www.dopplegangers.com" ); addWebLink( "Dutchbat Homeworld", "www.dutchbat-homeworld.com" ); addWebLink( "Euro Tribesplayers", "www.euro-tribesplayers.com" ); addWebLink( "eXtreme-Players", "www.eXtreme-players.de" ); +addWebLink( "IanStorm", "www.ianstorm.com" ); addWebLink( "Long Dongles", "www.longdongles.com" ); addWebLink( "MaxBaud.Net", "www.maxbaud.net" ); +addWebLink( "MoreGaming", "www.moregaming.com" ); addWebLink( "NetGames UK", "www.nguk.net" ); addWebLink( "PlanetTribes", "www.planettribes.com" ); addWebLink( "Rogue Disciples", "www.roguedisciples.com" ); addWebLink( "StrikeForce", "www.strikeforcecenter.com" ); addWebLink( "TeamSound", "www.teamsound.com" ); addWebLink( "Telepresence Heavy Assault Team", "www.that.co.nz" ); -addWebLink( "TribalWar", "www.tribalwar.com" ); +addWebLink( "Tribes2 Database", "www.tribes2database.com" ); addWebLink( "TribesMaps", "www.tribesmaps.com" ); +addWebLink( "TribalWar", "www.tribalwar.com" ); addWebLink( "Tribes-Universe", "www.tribes-universe.com" ); addWebLink( "WirePlay", "www.wireplay.com.au" ); -addWebLink( "IanStorm", "www.ianstorm.com" ); -addWebLink( "Tribes2 Database", "www.tribes2database.com" ); -//addWebLink( "Z Free", "games13.clear.net.nz" ); \ No newline at end of file +addWebLink( "ClanServ", "www.clanserv.com" ); +//addWebLink( "Z Free", "games13.clear.net.nz" ); + + diff --git a/base/scripts/webnews.cs b/base/scripts/webnews.cs index e605ede..8ceb798 100644 --- a/base/scripts/webnews.cs +++ b/base/scripts/webnews.cs @@ -45,10 +45,16 @@ function NewsGui::rebuildText(%this) for(%i = 0; %i < %this.articleCount; %i++) { %article = %this.article[%i]; - if(getField(%article,0)==1 || %this.acl > 2) - %editable = 1; - else - %editable = 0; + + %ai = wonGetAuthInfo(); + %isMem = 0; + for(%east=0;%east