riouken
-
Content Count
570 -
Joined
-
Last visited
-
Medals
Posts posted by riouken
-
-
Yes , as many people (On one Side) as you want to give the tablet to can have access at the same time. It works in MP, someone else can be piloting the drone while you view the video. It was designed with this specifically in mind, as the 15th has uav operators and I made this so the commander can link in and have a look at what that UAV operator is seeing. We are just now starting the closed beta with large scale MP testing , but I have not run into many problems with the mod on that front.
-
Thanks for everyones feed back. MacScottie is right, What I am planning right now is to have a configurable option to which side you could use this with, it will default to use with Nato, but you can set it up at the beginning of a mission to use it with Redfor. After setting this Redfor would be treated as blueflor by the tablet.So it will be one side or the other can use the tablet. I hope to have this in at or just after I release. Hopefully Im explaining that well...
Also I have had a few questions about the display text for each icon. It shows the groupID of the unit(s) and you can change that at mission start on the fly to anything you want with setGroupId .
-
I have some updates for everyone.
I have been working hard to get things completed, keep in mind this is Still WIP and some things may change slightly with the mod, it still needs some polish.
Changes:
Features ingame now:
-Commander's tablet
-Working FBCB2, Bluforce Tracker system
-User placed makers
-Android Based BFT
-Commanders Tablet can view live UAV streams
-Commanders Tablet can view live helmet cam streams
Features planned/coming soon:
-Vehicle mounted FBCB2, Blue Force Tracking
-Direct Text Messages
-
I don't really agree with this, I think the community in general does a great job of promoting and pushing the great mods to the top. Most people create addons because its their way of being creative, and most dont get paid for this. To imose limits and have some one else tell others how and when to be creative doesn't sound like a very appealing hobby to me.
I like Sttosin's idea, I think the addon/mod threads that are user reviewed/rated highly should be designated in a better way, maybe special markers or a separate section in the forums.
-
Any news on when the next update will be? Are you just waiting for release?
-
Thanks everyone for the feedback. Ill try and keep this thread updated as I move along on this project.
-
Your doing some great work, keep it up. If you need anything feel free to ask.
-
[WIP] cTab - Commander's Tablet - FBCB2, Bluforce Tracker
Here is my latest addon that I would like to share a preview with everyone.
Thanks to:
SpectreRSG - Graphic Design
Capt Drumheller / Jester814 - Technical advisor / Ideas / Media
LCpl C. Johnston - Technical advisor
LCpl Schwanke - Technical advisor
Everyone else in the 15th MEU SOC for help with support and testing.
Features ingame now:
- Commander's tablet
- Working FBCB2, Bluforce Tracker system
- User placed makers
- Tracks all crewed Bluefor vehicles
- Tracks any dismounted troops with the proper equipment.
- User placed markers / Salute reports etc...
- Android Based BFT Interface
- Commanders Tablet can view live UAV streams
- Commanders Tablet can view live helmet cam streams
Features planned/coming soon:
- Vehicle mounted Interface FBCB2, Blue Force Tracking
- Direct Text Messages
Possible future features:
- Free Drawing in FBCB2 system
- User defined names/naming in the GUI
- Mission Planning elements in the FBCB2 screen
Media:
UGx7zCjSkjv1g - Commander's tablet
-
They are map objects, they don't have true class names that you can access that I know of, but they gave us some helpful commands:
-
Ahh yes thank you I was missing the type...
type = CT_LISTNBOX;
When you look at one thing to long you miss the details.
-
I have a Dialog that worked in arma 2 with multi column listboxes, I was working to convert it to A3 and I have hit a roadblock, it does not seem to be working.
Base configs:
/////////////////////////////////////////////////////////////////////////// /// Styles /////////////////////////////////////////////////////////////////////////// // Control types #define CT_STATIC 0 #define CT_BUTTON 1 #define CT_EDIT 2 #define CT_SLIDER 3 #define CT_COMBO 4 #define CT_LISTBOX 5 #define CT_TOOLBOX 6 #define CT_CHECKBOXES 7 #define CT_PROGRESS 8 #define CT_HTML 9 #define CT_STATIC_SKEW 10 #define CT_ACTIVETEXT 11 #define CT_TREE 12 #define CT_STRUCTURED_TEXT 13 #define CT_CONTEXT_MENU 14 #define CT_CONTROLS_GROUP 15 #define CT_SHORTCUTBUTTON 16 #define CT_XKEYDESC 40 #define CT_XBUTTON 41 #define CT_XLISTBOX 42 #define CT_XSLIDER 43 #define CT_XCOMBO 44 #define CT_ANIMATED_TEXTURE 45 #define CT_OBJECT 80 #define CT_OBJECT_ZOOM 81 #define CT_OBJECT_CONTAINER 82 #define CT_OBJECT_CONT_ANIM 83 #define CT_LINEBREAK 98 #define CT_USER 99 #define CT_MAP 100 #define CT_MAP_MAIN 101 #define CT_LISTNBOX 102 // Static styles #define ST_POS 0x0F #define ST_HPOS 0x03 #define ST_VPOS 0x0C #define ST_LEFT 0x00 #define ST_RIGHT 0x01 #define ST_CENTER 0x02 #define ST_DOWN 0x04 #define ST_UP 0x08 #define ST_VCENTER 0x0C #define ST_TYPE 0xF0 #define ST_SINGLE 0x00 #define ST_MULTI 0x10 #define ST_TITLE_BAR 0x20 #define ST_PICTURE 0x30 #define ST_FRAME 0x40 #define ST_BACKGROUND 0x50 #define ST_GROUP_BOX 0x60 #define ST_GROUP_BOX2 0x70 #define ST_HUD_BACKGROUND 0x80 #define ST_TILE_PICTURE 0x90 #define ST_WITH_RECT 0xA0 #define ST_LINE 0xB0 #define ST_SHADOW 0x100 #define ST_NO_RECT 0x200 #define ST_KEEP_ASPECT_RATIO 0x800 #define ST_TITLE ST_TITLE_BAR + ST_CENTER // Slider styles #define SL_DIR 0x400 #define SL_VERT 0 #define SL_HORZ 0x400 #define SL_TEXTURES 0x10 // progress bar #define ST_VERTICAL 0x01 #define ST_HORIZONTAL 0 // Listbox styles #define LB_TEXTURES 0x10 #define LB_MULTI 0x20 // Tree styles #define TR_SHOWROOT 1 #define TR_AUTOCOLLAPSE 2 // MessageBox styles #define MB_BUTTON_OK 1 #define MB_BUTTON_CANCEL 2 #define MB_BUTTON_USER 4 /////////////////////////////////////////////////////////////////////////// /// Base Classes /////////////////////////////////////////////////////////////////////////// class RscText { access = 0; type = 0; idc = -1; colorBackground[] = { 0, 0, 0, 0 }; colorText[] = { 1, 1, 1, 1 }; text = ""; fixedWidth = 0; x = 0; y = 0; h = 0.037; w = 0.3; style = 0; shadow = 1; colorShadow[] = { 0, 0, 0, 0.5 }; font = "PuristaMedium"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; linespacing = 1; }; class RscStructuredText { access = 0; type = 13; idc = -1; style = 0; colorText[] = { 1, 1, 1, 1 }; class Attributes { font = "PuristaMedium"; color = "#ffffff"; align = "left"; shadow = 1; }; x = 0; y = 0; h = 0.035; w = 0.1; text = ""; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; shadow = 1; }; class RscPicture { access = 0; type = 0; idc = -1; style = 48; colorBackground[] = { 0, 0, 0, 0 }; colorText[] = { 1, 1, 1, 1 }; font = "TahomaB"; sizeEx = 0; lineSpacing = 0; text = ""; fixedWidth = 0; shadow = 0; x = 0; y = 0; w = 0.2; h = 0.15; }; class RscEdit { access = 0; type = 2; x = 0; y = 0; h = 0.04; w = 0.2; colorBackground[] = { 0, 0, 0, 1 }; colorText[] = { 0.95, 0.95, 0.95, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; colorSelection[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 1 }; autocomplete = ""; text = ""; size = 0.2; style = "0x00 + 0x40"; font = "PuristaMedium"; shadow = 2; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; canModify = 1; }; class RscCombo { access = 0; type = 4; colorSelect[] = { 0, 0, 0, 1 }; colorText[] = { 0.95, 0.95, 0.95, 1 }; colorBackground[] = { 0, 0, 0, 1 }; colorScrollbar[] = { 1, 0, 0, 1 }; soundSelect[] = { "\A3\ui_f\data\sound\RscCombo\soundSelect", 0.1, 1 }; soundExpand[] = { "\A3\ui_f\data\sound\RscCombo\soundExpand", 0.1, 1 }; soundCollapse[] = { "\A3\ui_f\data\sound\RscCombo\soundCollapse", 0.1, 1 }; maxHistoryDelay = 1; class ScrollBar { color[] = { 1, 1, 1, 0.6 }; colorActive[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.3 }; shadow = 0; thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; }; style = 16; x = 0; y = 0; w = 0.12; h = 0.035; shadow = 0; colorSelectBackground[] = { 1, 1, 1, 0.7 }; arrowEmpty = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_ca.paa"; arrowFull = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_active_ca.paa"; wholeHeight = 0.45; color[] = { 1, 1, 1, 1 }; colorActive[] = { 1, 0, 0, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; font = "PuristaMedium"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; }; class RscListBox { access = 0; type = 5; w = 0.4; h = 0.4; rowHeight = 0; colorText[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; colorScrollbar[] = { 1, 0, 0, 0 }; colorSelect[] = { 0, 0, 0, 1 }; colorSelect2[] = { 0, 0, 0, 1 }; colorSelectBackground[] = { 0.95, 0.95, 0.95, 1 }; colorSelectBackground2[] = { 1, 1, 1, 0.5 }; colorBackground[] = { 0, 0, 0, 0.3 }; soundSelect[] = { "\A3\ui_f\data\sound\RscListbox\soundSelect", 0.09, 1 }; arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; class ScrollBar { color[] = { 1, 1, 1, 0.6 }; colorActive[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.3 }; shadow = 0; thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; }; style = 16; font = "PuristaMedium"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; shadow = 0; colorShadow[] = { 0, 0, 0, 0.5 }; color[] = { 1, 1, 1, 1 }; period = 1.2; maxHistoryDelay = 1; autoScrollSpeed = -1; autoScrollDelay = 5; autoScrollRewind = 0; }; class RscButton { access = 0; type = 1; text = ""; colorText[] = { 1, 1, 1, 1 }; colorDisabled[] = { 0.4, 0.4, 0.4, 1 }; colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 0.7 }; colorBackgroundDisabled[] = { 0.95, 0.95, 0.95, 1 }; colorBackgroundActive[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 1 }; colorFocused[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 1 }; colorShadow[] = { 0, 0, 0, 1 }; colorBorder[] = { 0, 0, 0, 1 }; soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; style = 2; x = 0; y = 0; w = 0.095589; h = 0.039216; shadow = 2; font = "PuristaMedium"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; offsetX = 0.003; offsetY = 0.003; offsetPressedX = 0.002; offsetPressedY = 0.002; borderSize = 0; }; class RscShortcutButton { type = 16; x = 0.1; y = 0.1; class HitZone { left = 0; top = 0; right = 0; bottom = 0; }; class ShortcutPos { left = 0; top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; w = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; h = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; }; class TextPos { left = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)"; top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; right = 0.005; bottom = 0; }; shortcuts[] = { }; textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)"; color[] = { 1, 1, 1, 1 }; color2[] = { 0.95, 0.95, 0.95, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 1 }; colorBackground2[] = { 1, 1, 1, 1 }; soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; class Attributes { font = "PuristaMedium"; color = "#E5E5E5"; align = "left"; shadow = "true"; }; idc = -1; style = 0; default = 0; shadow = 1; w = 0.183825; h = "((((safezoneW / safezoneH) min 1.2) / 1.2) / 20)"; animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa"; animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa"; animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa"; animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa"; periodFocus = 1.2; periodOver = 0.8; period = 0.4; font = "PuristaMedium"; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; text = ""; action = ""; class AttributesImage { font = "PuristaMedium"; color = "#E5E5E5"; align = "left"; }; }; class RscShortcutButtonMain { idc = -1; style = 0; default = 0; w = 0.313726; h = 0.104575; color[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; class HitZone { left = 0; top = 0; right = 0; bottom = 0; }; class ShortcutPos { left = 0.0145; top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)) / 2"; w = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2) * (3/4)"; h = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; }; class TextPos { left = "(((safezoneW / safezoneH) min 1.2) / 32) * 1.5"; top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20)*2 - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)) / 2"; right = 0.005; bottom = 0; }; animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\normal_ca.paa"; animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\disabled_ca.paa"; animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\over_ca.paa"; animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\focus_ca.paa"; animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\down_ca.paa"; animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButtonMain\normal_ca.paa"; period = 0.5; font = "PuristaMedium"; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; text = ""; action = ""; class Attributes { font = "PuristaMedium"; color = "#E5E5E5"; align = "left"; shadow = "false"; }; class AttributesImage { font = "PuristaMedium"; color = "#E5E5E5"; align = "false"; }; }; class RscFrame { type = 0; idc = -1; style = 64; shadow = 2; colorBackground[] = { 0, 0, 0, 0 }; colorText[] = { 1, 1, 1, 1 }; font = "PuristaMedium"; sizeEx = 0.02; text = ""; }; class RscSlider { access = 0; type = 3; style = 1024; w = 0.3; color[] = { 1, 1, 1, 0.8 }; colorActive[] = { 1, 1, 1, 1 }; shadow = 0; h = 0.025; }; class IGUIBack { type = 0; idc = 124; style = 128; text = ""; colorText[] = { 0, 0, 0, 0 }; font = "PuristaMedium"; sizeEx = 0; shadow = 0; x = 0.1; y = 0.1; w = 0.1; h = 0.1; colorbackground[] = { "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", "(profilenamespace getvariable ['IGUI_BCG_RGB_A',0.8])" }; }; class RscCheckbox { idc = -1; type = 7; style = 0; x = "LINE_X(XVAL)"; y = "LINE_Y"; w = "LINE_W(WVAL)"; h = 0.029412; colorText[] = { 1, 0, 0, 1 }; color[] = { 0, 0, 0, 0 }; colorBackground[] = { 0, 0, 1, 1 }; colorTextSelect[] = { 0, 0.8, 0, 1 }; colorSelectedBg[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", 1 }; colorSelect[] = { 0, 0, 0, 1 }; colorTextDisable[] = { 0.4, 0.4, 0.4, 1 }; colorDisable[] = { 0.4, 0.4, 0.4, 1 }; font = "PuristaMedium"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; rows = 1; columns = 1; strings[] = { "UNCHECKED" }; checked_strings[] = { "CHECKED" }; }; class RscButtonMenu { idc = -1; type = 16; style = "0x02 + 0xC0"; default = 0; shadow = 0; x = 0; y = 0; w = 0.095589; h = 0.039216; animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)"; animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)"; animTextureOver = "#(argb,8,8,3)color(1,1,1,0.5)"; animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)"; colorBackground[] = { 0, 0, 0, 0.8 }; colorBackground2[] = { 1, 1, 1, 0.5 }; color[] = { 1, 1, 1, 1 }; color2[] = { 1, 1, 1, 1 }; colorText[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.25 }; class HitZone { left = 0.004; top = 0.029; right = 0.004; bottom = 0.029; }; period = 1.2; periodFocus = 1.2; periodOver = 1.2; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; class TextPos { left = "0.25 * (((safezoneW / safezoneH) min 1.2) / 40)"; top = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2"; right = 0.005; bottom = 0; }; class Attributes { font = "PuristaLight"; color = "#E5E5E5"; align = "left"; shadow = "false"; }; class ShortcutPos { left = "(6.25 * (((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005"; top = 0.005; w = 0.0225; h = 0.03; }; soundEnter[] = { "\A3\ui_f\data\sound\RscButtonMenu\soundEnter", 0.09, 1 }; soundPush[] = { "\A3\ui_f\data\sound\RscButtonMenu\soundPush", 0.09, 1 }; soundClick[] = { "\A3\ui_f\data\sound\RscButtonMenu\soundClick", 0.09, 1 }; soundEscape[] = { "\A3\ui_f\data\sound\RscButtonMenu\soundEscape", 0.09, 1 }; }; class RscButtonMenuOK { idc = 1; shortcuts[] = { "0x00050000 + 0", 28, 57, 156 }; default = 1; text = "OK"; soundPush[] = { "\A3\ui_f\data\sound\RscButtonMenuOK\soundPush", 0.09, 1 }; }; class RscButtonMenuCancel { idc = 2; shortcuts[] = { "0x00050000 + 1" }; text = "Cancel"; }; class RscControlsGroup { class VScrollbar { color[] = { 1, 1, 1, 1 }; width = 0.021; autoScrollSpeed = -1; autoScrollDelay = 5; autoScrollRewind = 0; shadow = 0; }; class HScrollbar { color[] = { 1, 1, 1, 1 }; height = 0.028; shadow = 0; }; class ScrollBar { color[] = { 1, 1, 1, 0.6 }; colorActive[] = { 1, 1, 1, 1 }; colorDisabled[] = { 1, 1, 1, 0.3 }; shadow = 0; thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; }; class Controls { }; type = 15; idc = -1; x = 0; y = 0; w = 1; h = 1; shadow = 0; style = 16; }; class WF_RscFrame { type = 0; idc = -1; style = 64; shadow = 2; colorBackground[] = {0,0,0,0.518}; colorText[] = {1,1,1,1}; font = "Zeppelin32"; sizeEx = 0.02; text = ""; }; class WF_RscSlider { access = 0; type = 3; style = 1024; w = 0.3; color[] = {1,1,1,0.8}; colorActive[] = {1,1,1,1}; shadow = 0; h = 0.025; }; class WF_RscMapControl { access = 0; idc = -1; type = CT_MAP_MAIN; style = ST_PICTURE; x = 0.10; y = 0.10; w = 0.80; h = 0.60; moveOnEdges = 1; shadow = 0; ptsPerSquareSea = 5; ptsPerSquareTxt = 3; ptsPerSquareCLn = 10; ptsPerSquareExp = 10; ptsPerSquareCost = 10; ptsPerSquareFor = 9; ptsPerSquareForEdge = 9; ptsPerSquareRoad = 6; ptsPerSquareObj = 9; showCountourInterval = 0; scaleMin = 0.001; scaleMax = 1.0; scaleDefault = 0.16; maxSatelliteAlpha = 0.85; alphaFadeStartScale = 0.35; alphaFadeEndScale = 0.4; colorBackground[] = {0.969,0.957,0.949,1.0}; colorSea[] = {0.467,0.631,0.851,0.5}; colorForest[] = {0.624,0.78,0.388,0.5}; colorForestBorder[] = {0.0,0.0,0.0,0.0}; colorRocks[] = {0.0,0.0,0.0,0.3}; colorRocksBorder[] = {0.0,0.0,0.0,0.0}; colorLevels[] = {0.286,0.177,0.094,0.5}; colorMainCountlines[] = {0.572,0.354,0.188,0.5}; colorCountlines[] = {0.572,0.354,0.188,0.25}; colorMainCountlinesWater[] = {0.491,0.577,0.702,0.6}; colorCountlinesWater[] = {0.491,0.577,0.702,0.3}; colorPowerLines[] = {0.1,0.1,0.1,1.0}; colorRailWay[] = {0.8,0.2,0.0,1.0}; colorNames[] = {0.1,0.1,0.1,0.9}; colorInactive[] = {1.0,1.0,1.0,0.5}; colorOutside[] = {0.0,0.0,0.0,1.0}; colorTracks[] = {0.84,0.76,0.65,0.15}; colorTracksFill[] = {0.84,0.76,0.65,1.0}; colorRoads[] = {0.7,0.7,0.7,1.0}; colorRoadsFill[] = {1.0,1.0,1.0,1.0}; colorMainRoads[] = {0.9,0.5,0.3,1.0}; colorMainRoadsFill[] = {1.0,0.6,0.4,1.0}; colorGrid[] = {0.1,0.1,0.1,0.6}; colorGridMap[] = {0.1,0.1,0.1,0.6}; fontLabel = "PuristaMedium"; sizeExLabel = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; fontGrid = "TahomaB"; sizeExGrid = 0.02; fontUnits = "TahomaB"; sizeExUnits = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; fontNames = "PuristaMedium"; sizeExNames = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8) * 2"; fontInfo = "PuristaMedium"; sizeExInfo = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; fontLevel = "TahomaB"; sizeExLevel = 0.02; colorText[] = {1,1,1,1.0}; font = "PuristaMedium"; text = "#(argb,8,8,3)color(1,1,1,1)"; SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; //size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; class Legend { x = "SafeZoneX + ( ((safezoneW / safezoneH) min 1.2) / 40)"; y = "SafeZoneY + safezoneH - 4.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; w = "10 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; h = "3.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; font = "PuristaMedium"; sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; colorBackground[] = {1,1,1,0.5}; color[] = {0,0,0,1}; }; class Task { icon = "\A3\ui_f\data\map\mapcontrol\taskIcon_CA.paa"; iconCreated = "\A3\ui_f\data\map\mapcontrol\taskIconCreated_CA.paa"; iconCanceled = "\A3\ui_f\data\map\mapcontrol\taskIconCanceled_CA.paa"; iconDone = "\A3\ui_f\data\map\mapcontrol\taskIconDone_CA.paa"; iconFailed = "\A3\ui_f\data\map\mapcontrol\taskIconFailed_CA.paa"; color[] = {"(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])","(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])","(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])","(profilenamespace getvariable ['IGUI_TEXT_RGB_A',0.8])"}; colorCreated[] = {1,1,1,1}; colorCanceled[] = {0.7,0.7,0.7,1}; colorDone[] = {0.7,1,0.3,1}; colorFailed[] = {1,0.3,0.2,1}; size = 27; importance = 1; coefMin = 1; coefMax = 1; }; class Waypoint { icon = "\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa"; color[] = {0,0,0,1}; size = 27; importance = 1; coefMin = 1; coefMax = 1; }; class WaypointCompleted { icon = "\A3\ui_f\data\map\mapcontrol\waypointCompleted_ca.paa"; color[] = {0,0,0,1}; size = 27; importance = 1; coefMin = 1; coefMax = 1; }; class CustomMark { icon = "\A3\ui_f\data\map\mapcontrol\custommark_ca.paa"; size = 24; importance = 1; coefMin = 1; coefMax = 1; color[] = {0,0,0,1}; }; class Command { icon = "\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa"; size = 18; importance = 1; coefMin = 1; coefMax = 1; color[] = {1,1,1,1}; }; class Bush { icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; color[] = {0.45,0.64,0.33,0.4}; size = "14/2"; importance = "0.2 * 14 * 0.05 * 0.05"; coefMin = 0.25; coefMax = 4; }; class Rock { icon = "\A3\ui_f\data\map\mapcontrol\rock_ca.paa"; color[] = {0.1,0.1,0.1,0.8}; size = 12; importance = "0.5 * 12 * 0.05"; coefMin = 0.25; coefMax = 4; }; class SmallTree { icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; color[] = {0.45,0.64,0.33,0.4}; size = 12; importance = "0.6 * 12 * 0.05"; coefMin = 0.25; coefMax = 4; }; class Tree { icon = "\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; color[] = {0.45,0.64,0.33,0.4}; size = 12; importance = "0.9 * 16 * 0.05"; coefMin = 0.25; coefMax = 4; }; class busstop { icon = "\A3\ui_f\data\map\mapcontrol\busstop_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class fuelstation { icon = "\A3\ui_f\data\map\mapcontrol\fuelstation_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class hospital { icon = "\A3\ui_f\data\map\mapcontrol\hospital_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class church { icon = "\A3\ui_f\data\map\mapcontrol\church_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class lighthouse { icon = "\A3\ui_f\data\map\mapcontrol\lighthouse_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class power { icon = "\A3\ui_f\data\map\mapcontrol\power_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class powersolar { icon = "\A3\ui_f\data\map\mapcontrol\powersolar_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class powerwave { icon = "\A3\ui_f\data\map\mapcontrol\powerwave_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class powerwind { icon = "\A3\ui_f\data\map\mapcontrol\powerwind_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class quay { icon = "\A3\ui_f\data\map\mapcontrol\quay_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class shipwreck { icon = "\A3\ui_f\data\map\mapcontrol\shipwreck_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class transmitter { icon = "\A3\ui_f\data\map\mapcontrol\transmitter_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class watertower { icon = "\A3\ui_f\data\map\mapcontrol\watertower_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {1,1,1,1}; }; class Cross { icon = "\A3\ui_f\data\map\mapcontrol\Cross_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {0,0,0,1}; }; class Chapel { icon = "\A3\ui_f\data\map\mapcontrol\Chapel_CA.paa"; size = 24; importance = 1; coefMin = 0.85; coefMax = 1.0; color[] = {0,0,0,1}; }; class Bunker { icon = "\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; size = 14; importance = "1.5 * 14 * 0.05"; coefMin = 0.25; coefMax = 4; color[] = {0,0,0,1}; }; class Fortress { icon = "\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; size = 16; importance = "2 * 16 * 0.05"; coefMin = 0.25; coefMax = 4; color[] = {0,0,0,1}; }; class Fountain { icon = "\A3\ui_f\data\map\mapcontrol\fountain_ca.paa"; size = 11; importance = "1 * 12 * 0.05"; coefMin = 0.25; coefMax = 4; color[] = {0,0,0,1}; }; class Ruin { icon = "\A3\ui_f\data\map\mapcontrol\ruin_ca.paa"; size = 16; importance = "1.2 * 16 * 0.05"; coefMin = 1; coefMax = 4; color[] = {0,0,0,1}; }; class Stack { icon = "\A3\ui_f\data\map\mapcontrol\stack_ca.paa"; size = 20; importance = "2 * 16 * 0.05"; coefMin = 0.9; coefMax = 4; color[] = {0,0,0,1}; }; class Tourism { icon = "\A3\ui_f\data\map\mapcontrol\tourism_ca.paa"; size = 16; importance = "1 * 16 * 0.05"; coefMin = 0.7; coefMax = 4; color[] = {0,0,0,1}; }; class ViewTower { icon = "\A3\ui_f\data\map\mapcontrol\viewtower_ca.paa"; size = 16; importance = "2.5 * 16 * 0.05"; coefMin = 0.5; coefMax = 4; color[] = {0,0,0,1}; }; class ActiveMarker { //icon = "\A3\ui_f\data\map\mapcontrol\custommark_ca.paa"; size = 24; importance = 1; coefMin = 1; coefMax = 1; color[] = {0,0,0,1}; }; };
Dialog config:
//--- Warfront #define IDC_WARFRONT_WF_CARGOTXT 1018 #define IDC_WARFRONT_WF_ITEMIMG 1200 #define IDC_WARFRONT_WF_CARGOLIST 1500 #define IDC_WARFRONT_WF_BACKGROUND 2200 #define IDC_WARFRONT_WF_UNLOADBTN 2400 #define IDC_WARFRONT_WF_CANCELBTN 2401 class WF_supply_dlg { idd = 1734; movingEnable = true; onLoad = "uiNamespace setVariable ['WF_supply_dlg', (_this select 0)];execVM 'client\gui\wf_supply_setup.sqf';"; objects[] = {}; class controlsBackground {}; class controls { class WF_background: IGUIBack { idc = IDC_WARFRONT_WF_BACKGROUND; x = 0.309687 * safezoneW + safezoneX; y = 0.29 * safezoneH + safezoneY; w = 0.387187 * safezoneW; h = 0.406 * safezoneH; }; class WF_cargotxt: RscText { idc = IDC_WARFRONT_WF_CARGOTXT; text = "Warfront Cargo"; //--- ToDo: Localize; x = 0.269271 * safezoneW + safezoneX; y = 0.191074 * safezoneH + safezoneY; w = 0.1575 * safezoneW; h = 0.056 * safezoneH; }; class WF_Cargolist: RscListbox { idc = IDC_WARFRONT_WF_CARGOLIST; style = LB_MULTI; columns[] = {0.003,0.1,0.8}; drawSideArrows = 0; idcLeft = -1; idcRight = -1; maxHistoryDelay = 1; rowHeight = 0; x = 0.319794 * safezoneW + safezoneX; y = 0.3404 * safezoneH + safezoneY; w = 0.216562 * safezoneW; h = 0.294 * safezoneH; }; class WF_itemimg: RscPicture { idc = IDC_WARFRONT_WF_ITEMIMG; text = "#(argb,8,8,3)color(1,1,1,1)"; x = 0.572187 * safezoneW + safezoneX; y = 0.346 * safezoneH + safezoneY; w = 0.091875 * safezoneW; h = 0.14 * safezoneH; }; class WF_unloadbtn: RscShortcutButton { idc = IDC_WARFRONT_WF_UNLOADBTN; text = "Unload"; //--- ToDo: Localize; x = 0.569687 * safezoneW + safezoneX; y = 0.533444 * safezoneH + safezoneY; w = 0.0984375 * safezoneW; h = 0.042 * safezoneH; action = "execVM 'client\gui\wf_supply_unload.sqf';"; }; class WF_cancelbtn: RscShortcutButton { idc = IDC_WARFRONT_WF_CANCELBTN; text = "Cancel"; //--- ToDo: Localize; x = 0.592662 * safezoneW + safezoneX; y = 0.64364 * safezoneH + safezoneY; w = 0.0984375 * safezoneW; h = 0.042 * safezoneH; action = "closeDialog 0"; }; }; };
Adding items:
//// Warfront // // Created by: Riouken // disableSerialization; _display = (uiNamespace getVariable "WF_supply_dlg"); _lb = _display displayCtrl 1500; lbClear _lb; _supplies = wf_fob_supplies; { _classname = _x select 0; _text = _x select 1; _count = _x select 2; _pic = getText (configFile >> "cfgVehicles" >> _classname >> "icon"); _index = _lb lnbAddRow ["",_text,(str _count)]; lnbSetPicture [1500,[_index,0],_pic]; } forEach _supplies; _lb lbSetCurSel 0;
This all works in A2 but when I updated it for A3 I cant seem to get the multi - column's to work. I even searched the A3 ui_f config looking for any refrence to multi column listboxes in A3 but could not find any. I get no errors in the .rpt or script errors.
Anyone see a mistake I have made or maybe a Dev could shed some light on this?
I know the Dialog is working as I can add items normally and pictures:
_index = _lb lbAdd _text; _lb lbSetPicture [_index, _pic];
-
lol its all good man.
-
-
Am I right in thinking this is more of an event driven scripting language?SQF files are not objects they are functions that may or may not return something?
Always use the server to store state unless absolutely sure that its not possible?
Is there a place to get a list of events that you can add functions to be run from?
This is becoming a great resource of information for arma 3 beginners but have previous object orientated experience. God I cant wait for the arma 3 java api.
1. Its a lot like procedural programing
2. SQF files are code. Not all are functions. Functions are saved to a variable and used at some point.
3. Yes in general when dealing with Multi Player you want to run as much of the code on the server as you can, and just localize the code that needs to run on the clients.
4. http://community.bistudio.com/wiki/ArmA:_Event_Handlers
http://community.bistudio.com/wiki/addEventHandler
5. Dont get your hopes up to far about Java, if or when it does arrive, the overhead from the system may not provide enough of a reason to use it over sqf except in explicit cases.
---------- Post added at 07:28 AM ---------- Previous post was at 07:21 AM ----------
The big idea behind functions is this: if your only going to need a peice of code once then just leave it in the .sqf and the call it with execVM. But if you will be using it more than once, its better for performance if you just compile it once and save it to a variable and then just call it from memory when you need it.
-
It can return a value. Like in my distance check function.
If you want to to return a value you use:
http://community.bistudio.com/wiki/call
And if you just need it to run concurrently or with sleep with no return then use:
-
So wf_fnc_distance_to holds a reference to that script. Correct? So as long as you have that variable, you can call the function?
Yes that is correct.
Parameters are passed to the function via an array, and then select 0, and select 1 are accessing those parameters. Correct?
Yes
I see what you're doing there, where a function is in a single sqf file. Is there a way to have multiple functions in a single file and then call one or the other?
Yes there is, you can build and compile them all in one file and then reference them later:
This is a client function file from Domination, its a bit more advanced, he is using prepocessor commands and macros to compile and save them but yes it can be done.
#define THIS_FILE "x_playerfuncs.sqf" #include "x_setup.sqf" if ((GVAR(string_player) in GVAR(is_engineer)) || GVAR(with_ai) || GVAR(with_ai_features) == 0) then { #ifndef __ACE__ FUNC(sfunc) = { private "_objs"; if (vehicle player == player) then { _objs = nearestObjects [player, ["LandVehicle","Air"], 7]; if (count _objs > 0) then { GVAR(objectID2) = _objs select 0; if (alive GVAR(objectID2)) then { (damage GVAR(objectID2) > 0.05 || fuel GVAR(objectID2) < 1) } else { false } } } else { false } }; #else FUNC(sfunc) = { private "_objs"; if (vehicle player == player && (player call ace_sys_ruck_fnc_hasRuck)) then { _objs = nearestObjects [player, ["LandVehicle","Air"], 7]; if (count _objs > 0) then { GVAR(objectID2) = _objs select 0; if (alive GVAR(objectID2)) then { (damage GVAR(objectID2) > 0.05 || fuel GVAR(objectID2) < 1) } else { false } } } else { false } }; #endif FUNC(ffunc) = { private ["_l","_vUp","_winkel"]; if (vehicle player == player) then { GVAR(objectID1) = position player nearestObject "LandVehicle"; if (!alive GVAR(objectID1) || player distance GVAR(objectID1) > 8) then { false } else { _vUp = vectorUp GVAR(objectID1); if ((_vUp select 2) < 0 && player distance (position player nearestObject GVAR(rep_truck)) < 20) then { true } else { _l=sqrt((_vUp select 0)^2+(_vUp select 1)^2); if (_l != 0) then { _winkel = (_vUp select 2) atan2 _l; (_winkel < 30 && player distance (position player nearestObject GVAR(rep_truck)) < 20) } } } } else { false } }; }; FUNC(PlacedObjAn) = { if (GVAR(string_player) == _this) then { if (GVAR(player_is_medic)) then { _m_name = "Mash " + _this; [QGVAR(w_ma),_m_name] call FUNC(NetCallEvent); __pSetVar [QGVAR(medtent), []]; _medic_tent = __pGetVar(medic_tent); if (!isNil "_medic_tent") then {if (!isNull _medic_tent) then {deleteVehicle _medic_tent}}; __pSetVar ["medic_tent", objNull]; "Your mash was destroyed !!!" call FUNC(GlobalChat); }; if (GVAR(player_can_build_mgnest)) then { _m_name = "MG Nest " + _this; [QGVAR(w_ma),_m_name] call FUNC(NetCallEvent); __pSetVar [QGVAR(mgnest_pos), []]; _mg_nest = __pGetVar(mg_nest); if (!isNil "_mg_nest") then {if (!isNull _mg_nest) then {deleteVehicle _mg_nest}}; __pSetVar ["mg_nest", objNull]; "Your MG nest was destroyed !!!" call FUNC(GlobalChat); }; if (GVAR(eng_can_repfuel)) then { _m_name = "FARP " + _this; [QGVAR(w_ma),_m_name] call FUNC(NetCallEvent); __pSetVar [QGVAR(farp_pos), []]; _farp = __pGetVar(GVAR(farp_obj)); if (!isNil "_farp") then {if (!isNull _farp) then {deleteVehicle _farp}}; __pSetVar [QGVAR(farp_obj), objNull]; "Your FARP was destroyed !!!" call FUNC(GlobalChat); }; }; }; #ifndef __TT__ FUNC(RecapturedUpdate) = { private ["_index","_target_array", "_target_name", "_targetName","_state"]; PARAMS_2(_index,_state); _target_array = GVAR(target_names) select _index; _target_name = _target_array select 1; switch (_state) do { case 0: { _target_name setMarkerColorLocal "ColorRed"; _target_name setMarkerBrushLocal "FDiagonal"; hint composeText[ parseText("<t color='#f0ff0000' size='2'>" + "Attention:" + "</t>"), lineBreak, parseText("<t size='1'>" + format ["Enemy mobile forces have recaptured %1!!!", _target_name] + "</t>") ]; format ["Attention!!! Enemy mobile forces have recaptured %1!!!", _target_name] call FUNC(HQChat); }; case 1: { _target_name setMarkerColorLocal "ColorGreen"; _target_name setMarkerBrushLocal "Solid"; hint composeText[ parseText("<t color='#f00000ff' size='2'>" + "Good work!" + "</t>"), lineBreak, parseText("<t size='1'>" + format ["You have captured %1 again!!!", _target_name] + "</t>") ]; }; }; }; #endif FUNC(PlayerRank) = { private ["_score","_d_player_old_score","_d_player_old_rank"]; _score = score player; _d_player_old_score = __pGetVar(GVAR(player_old_score)); if (isNil "_d_player_old_score") then {_d_player_old_score = 0}; _d_player_old_rank = __pGetVar(GVAR(player_old_rank)); if (isNil "_d_player_old_rank") then {_d_player_old_rank = "PRIVATE"}; if (_score < (GVAR(points_needed) select 0) && _d_player_old_rank != "PRIVATE") exitWith { if (_d_player_old_score >= (GVAR(points_needed) select 0)) then {(format ["You were degraded from %1 to Private !!!",_d_player_old_rank]) call FUNC(HQChat)}; _d_player_old_rank = "PRIVATE"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; __pSetVar [QGVAR(player_old_score), _score]; }; if (_score < (GVAR(points_needed) select 1) && _score >= (GVAR(points_needed) select 0) && _d_player_old_rank != "CORPORAL") exitWith { if (_d_player_old_score < (GVAR(points_needed) select 1)) then { "You were promoted to Corporal, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; } else { (format ["You were degraded from %1 to Corporal !!!",_d_player_old_rank]) call FUNC(HQChat); }; _d_player_old_rank = "CORPORAL"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; if (_score < (GVAR(points_needed) select 2) && _score >= (GVAR(points_needed) select 1) && _d_player_old_rank != "SERGEANT") exitWith { if (_d_player_old_score < (GVAR(points_needed) select 2)) then { "You were promoted to Sergeant, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; } else { (format ["You were degraded from %1 to Sergeant !!!",_d_player_old_rank]) call FUNC(HQChat); }; _d_player_old_rank = "SERGEANT"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; if (_score < (GVAR(points_needed) select 3) && _score >= (GVAR(points_needed) select 2) && _d_player_old_rank != "LIEUTENANT") exitWith { if (_d_player_old_score < (GVAR(points_needed) select 3)) then { "You were promoted to Lieutenant, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; } else { (format ["You were degraded from %1 to Lieutenant !!!",_d_player_old_rank]) call FUNC(HQChat); }; _d_player_old_rank = "LIEUTENANT"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; if (_score < (GVAR(points_needed) select 4) && _score >= (GVAR(points_needed) select 3) && _d_player_old_rank != "CAPTAIN") exitWith { if (_d_player_old_score < (GVAR(points_needed) select 4)) then { "You were promoted to Captain, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; } else { (format ["You were degraded from %1 to Captain !!!",_d_player_old_rank]) call FUNC(HQChat); }; _d_player_old_rank = "CAPTAIN"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; if (_score < (GVAR(points_needed) select 5) && _score >= (GVAR(points_needed) select 4) && _d_player_old_rank != "MAJOR") exitWith { if (_d_player_old_score < (GVAR(points_needed) select 4)) then { "You were promoted to Major, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; } else { (format ["You were degraded from %1 to Major !!!",_d_player_old_rank]) call FUNC(HQChat); }; _d_player_old_rank = "MAJOR"; player setRank _d_player_old_rank; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; if (_score >= (GVAR(points_needed) select 5) && _d_player_old_rank != "COLONEL") exitWith { _d_player_old_rank = "COLONEL"; player setRank _d_player_old_rank; "You were promoted to Colonel, congratulations !!!" call FUNC(HQChat); playSound "fanfare"; __pSetVar [QGVAR(player_old_score), _score]; __pSetVar [QGVAR(player_old_rank), _d_player_old_rank]; }; }; FUNC(GetRankIndex) = {["PRIVATE","CORPORAL","SERGEANT","LIEUTENANT","CAPTAIN","MAJOR","COLONEL"] find (toUpper (_this))}; FUNC(GetRankString) = { switch (toUpper(_this)) do { case "PRIVATE": {"Private"}; case "CORPORAL": {"Corporal"}; case "SERGEANT": {"Sergeant"}; case "LIEUTENANT": {"Lieutenant"}; case "CAPTAIN": {"Captain"}; case "MAJOR": {"Major"}; case "COLONEL": {"Colonel"}; } }; FUNC(GetRankFromScore) = { if (_this < (GVAR(points_needed) select 0)) exitWith {"Private"}; if (_this < (GVAR(points_needed) select 1)) exitWith {"Corporal"}; if (_this < (GVAR(points_needed) select 2)) exitWith {"Sergeant"}; if (_this < (GVAR(points_needed) select 3)) exitWith {"Lieutenant"}; if (_this < (GVAR(points_needed) select 4)) exitWith {"Captain"}; if (_this < (GVAR(points_needed) select 5)) then {"Major"} else {"Colonel"} }; FUNC(GetRankPic) = { switch (toUpper(_this)) do { case "PRIVATE": {"\CA\warfare2\Images\rank_private.paa"}; case "CORPORAL": {"\CA\warfare2\Images\rank_corporal.paa"}; case "SERGEANT": {"\CA\warfare2\Images\rank_sergeant.paa"}; case "LIEUTENANT": {"\CA\warfare2\Images\rank_lieutenant.paa"}; case "CAPTAIN": {"\CA\warfare2\Images\rank_captain.paa"}; case "MAJOR": {"\CA\warfare2\Images\rank_major.paa"}; case "COLONEL": {"\CA\warfare2\Images\rank_colonel.paa"}; } }; #ifndef __TT__ if (isNil "d_with_carrier") then { FUNC(BaseEnemies) = { private "_status"; _status = _this select 0; switch (_status) do { case 0: { hint composeText[ parseText("<t color='#f0ff0000' size='2'>" + "DANGER:" + "</t>"), lineBreak, parseText("<t size='1'>" + "Enemy troops in your base." + "</t>") ]; }; case 1: { hint composeText[ parseText("<t color='#f00000ff' size='2'>" + "CLEAR:" + "</t>"), lineBreak, parseText("<t size='1'>" + "No more enemies in your base." + "</t>") ]; }; }; }; FUNC(XFacAction) = { private ["_num","_thefac","_element","_posf","_facid","_exit_it"]; PARAMS_1(_num); _thefac = switch (_num) do { case 0: {QGVAR(jet_serviceH)}; case 1: {QGVAR(chopper_serviceH)}; case 2: {QGVAR(wreck_repairH)}; }; waitUntil {(sleep 0.521 + (random 0.3));(X_JIPH getVariable _thefac)}; _element = GVAR(aircraft_facs) select _num; _posf = _element select 0; sleep 0.543; _facid = -1; _exit_it = false; while {!_exit_it} do { sleep 0.432; switch (_num) do { case 0: {if (__XJIPGetVar(GVAR(jet_s_reb))) then {_exit_it = true}}; case 1: {if (__XJIPGetVar(GVAR(chopper_s_reb))) then {_exit_it = true}}; case 2: {if (__XJIPGetVar(GVAR(wreck_s_reb))) then {_exit_it = true}}; }; if (!_exit_it) then { if (player distance _posf < 14 && (X_JIPH getVariable _thefac) && _facid == -1) then { if (alive player) then { _facid = player addAction ["Rebuild Support Building" call FUNC(RedText),"x_client\x_rebuildsupport.sqf",_num]; }; } else { if (_facid != -1) then { if (player distance _posf > 13 || !(X_JIPH getVariable _thefac)) then { player removeAction _facid; _facid = -1; }; }; }; } else { if (_facid != -1) then {player removeAction _facid}; }; }; }; }; #endif FUNC(ProgBarCall) = { private ["_captime", "_wf", "_curcaptime", "_disp", "_control", "_backgroundControl", "_maxWidth", "_position", "_newval"]; PARAMS_1(_wf); disableSerialization; _captime = _wf getVariable QGVAR(CAPTIME); _curcaptime = _wf getVariable QGVAR(CURCAPTIME); _curside = _wf getVariable QGVAR(SIDE); _disp = __uiGetVar(DPROGBAR); _control = _disp displayCtrl 3800; _backgroundControl = _disp displayCtrl 3600; _maxWidth = (ctrlPosition _backgroundControl select 2) - 0.01; _position = ctrlPosition _control; _newval = if (_curside != GVAR(own_side_trigger)) then {(_maxWidth * _curcaptime / _captime) max 0.02} else {_maxWidth}; _position set [2, _newval]; _r = 1 - (_newval * 2.777777); _g = _newval * 2.777777; _control ctrlSetPosition _position; //_control ctrlSetBackgroundColor (if !(_wf getVariable QGVAR(STALL)) then {[0.543, 0.5742, 0.4102, 0.8]} else {[1, 1, 0, 0.8]}); _control ctrlSetBackgroundColor (if !(_wf getVariable QGVAR(STALL)) then {[_r, _g, 0, 0.8]} else {[1, 1, 0, 0.8]}); _control ctrlCommit 3; }; FUNC(ArtyShellTrail) = { private ["_shpos", "_trails", "_ns", "_sh", "_trail"]; PARAMS_3(_shpos,_trails,_ns); if (_trails != "") then { _sh = _ns createVehicleLocal [_shpos select 0, _shpos select 1, 150]; _sh setPosASL _shpos; _sh setVelocity [0,0,-150]; _trail = [_sh] call compile preprocessFile _trails; waitUntil {isNull _sh}; sleep 1; deleteVehicle _trail; }; }; FUNC(ParaExploitHandler) = { if (animationState player == "halofreefall_non") then { if ((_this select 4) isKindOf "TimeBombCore") then { deleteVehicle (_this select 6); player addMagazine (_this select 5); }; }; }; #ifdef __ACE__ FUNC(DHaha) = { private ["_endtime", "_oldident"]; _endtime = __pGetVar(GVAR(HAHA_END)); if (isNil "_endtime") then {_endtime = -1}; if (time < _endtime) exitWith { _endtime = _endtime + 600; __pSetVar [QGVAR(HAHA_END), _endtime]; }; _endtime = time + 600; __pSetVar [QGVAR(HAHA_END), _endtime]; _oldident = __pGetVar(ACE_Identity); ["ace_sys_goggles_setident2", [player, "ACE_GlassesHaHa"]] call CBA_fnc_globalEvent; [_oldident] spawn { private ["_oldident", "_curident"]; PARAMS_1(_oldident); while {time < __pGetVar(GVAR(HAHA_END))} do { if (alive player) then { _curident = __pGetVar(ACE_Identity); if (_curident != "ACE_GlassesHaHa") then { ["ace_sys_goggles_setident2", [player, "ACE_GlassesHaHa"]] call CBA_fnc_globalEvent; }; }; sleep 1; }; ["ace_sys_goggles_setident2", [player, _oldident]] call CBA_fnc_globalEvent; }; }; #endif FUNC(LightObj) = { private "_light"; _light = "#lightpoint" createVehicleLocal [0,0,0]; _light setLightBrightness 1; _light setLightAmbient[0.2, 0.2, 0.2]; _light setLightColor[0.01, 0.01, 0.01]; _light lightAttachObject [_this, [0,0,0]]; };
Consider this simple Java class (Note this is taken from an actual project, so don't worry too much about what's going on inside the methods):
Do we see any construct like this in SQF? Or does each .sqf file run from top to bottom and that's it, and there's no way to call a specific part of the code?
Nope, SQF is not OO. each file will run based on its code and with the exceptions that we talked about earlier in the thread, ie saving data into variables or passing it to something else, once the sqf runs thats it.
I have to post this here, it would not let me post otherwise lol.
-
Here is a function for checking the sea level distance from airborne objects to a pos on the ground.
// wf_fnc_distance_to.sqf // By Riouken _obj1 = _this select 0; _obj2 = _this select 1; _pos_obj1 = [_obj1 select 0,_obj1 select 1]; _pos_obj2 = [_obj2 select 0,_obj2 select 1]; _result = _pos_obj1 distance _pos_obj2; _result
I create it in a "init" file that I only run on the server(that way it is available anywhere on the server machine)
wf_fnc_distance_to = compile preprocessFileLineNumbers "server\fnc\wf_fnc_distance_to.sqf";
Now I can call it from any script on the server machine like this:
Here is a script(actually this is another function that I call it from) that I call it in:
_loc = _this select 0; _cargo = _this select 1; _spwnpos = [(getMarkerPos "air_spawn") select 0, (getMarkerPos "air_spawn") select 1,600]; _dir = [_spwnpos, _loc] call BIS_fnc_dirTo; _c130array = [_spwnpos, _dir, "C130J_US_EP1", WEST] call bis_fnc_spawnvehicle; _c130 = _c130array select 0; _c130 allowDamage false; _transgrp = group _c130; _wp = _transgrp addWaypoint [_loc, 0]; [_transgrp, 0] setWaypointType "MOVE"; _c130 flyinHeight 400; _dropcargo = false; while {! _dropcargo} do { [color=#ff0000]_dist = [getPosAsl _c130,_loc] call wf_fnc_distance_to;[/color] if (_dist < 300) then { _dropcargo = true; }; sleep 1; }; waitUntil {_dropcargo}; if (_cargo == "Land_Misc_Cargo1E_EP1") then { _dropcargo = [_c130,_cargo] spawn wf_fnc_supply_drop; sleep .07; _dropcargo = [_c130,_cargo] spawn wf_fnc_supply_drop; }else { _dropcargo = [_c130,_cargo] spawn wf_fnc_supply_drop; }; sleep 3; _wp = _transgrp addWaypoint [_spwnpos, 1]; [_transgrp, 1] setWaypointType "MOVE"; _backtobase = false; while {! _backtobase} do { _dist = [getPosAsl _c130,_spwnpos] call wf_fnc_distance_to; if (_dist < 500) then { deleteVehicle _c130; }; sleep 5; };
---------- Post added at 07:35 PM ---------- Previous post was at 07:22 PM ----------
Here is a silly example of a very limited scope for a function.
while {time > 10} do { _starttime = time; // This function will only be availble in this loop that we created it in. _howLongHasItBeen = { _newtime = (_this select 0) - _starttime; _newtime }; While {true} do { _newtime = [time] call _howLongHasItBeen; hint str _newtime; sleep 1; }; sleep 1; }; // _howLongHasItBeen would not work out side the loop above.
-
if(isClient) { run script // My client functions/scripts....stuff etc. myfunction = do some stuff... } else { // What ever we ran above would not be availibel in this case unless we sent the data to this scope, like we talked about before. // You can do stuff here for what ever is not a client... ie the server. }
If you create the function on only one machine then only it will know about it. If you create it on everyone's machine you can execute it everywhere.
-
Now my question is can functions be public or private?
You can limit the scope of functions by only running them on a particular machine, for instance the server, or only on clients or on one particular client.
-
-
You can either use the Sites module or you can use scripting like DAC.
-
They can't communicate. The only two ways to get data in or out is to pass data to the thread:
_null =[this,stuff gets passed to the thread] execVM "my script.sqf";
And saving variables to a global namespace and then checking those in another thread. Scope matters a lot when coding like this.
---------- Post added at 03:16 PM ---------- Previous post was at 03:10 PM ----------
A lot of scripting in arma revolves around functions. You pass data to them and either wait for a return or they go off on their own to do a task while your other script finishes up.
-
In reference to your locality check question yes you can check it. There is a. Command for it:
-
To hopefully get this back on topic... There are some conversion mods out there but it does not work the same as some other engine's like "source" etc... In arma you do not have as much access to the engine. Almost every thing is done with the API. So almost everything is done either mission/script based or Mod based.
For some good examples of conversion mods and how they are done here are some you can download and open up to see how it works.
[WIP] cTab - Commander's Tablet - FBCB2, Bluforce Tracker
in ARMA 3 - ADDONS & MODS: DISCUSSION
Posted
Thanks :o
Since everyone is in the Christmas mood, a little gift for everyone , a small progress update:
I am into a closed beta now, and I am polishing up the GUI and fixing any bugs that arise in beta. The only major thing Im waiting on for a public release is the vehicle interface, as soon as thats done I will see about getting the first version out to everyone.
Update - v1.0.0.2
Changelog:
-Polished up the tablet gui.
-Added quick access keys on tablet, F1,F2,F3
-Cleaned up the Helmet Cam and UAV Gui and made it look more realistic. (Let me know what you think)
-Polished up the navigation of menu's in the Tablet
-fixed helmet cam offset issues, helmet cam pip now shows the correct view no matter the animation the unit is in.
-Tablet interface is 98% done.
Media: