Dowódców grup, lub jakichś ich członków przydałoby się jakoś charakterystycznie nazwać(, żeby ze skryptów można było łatwo uzyskać dostęp do poszczególnych grup), np d1, d2, ..., dN
W init.sqf przydadzą się zmienne przechowujące ilość dostępnych wezwań (artylerii, nalotu, cobry), pozycje (lub otoczeniem pozycji) którymi mają się "zająć"/"odwiedzić", zmienne mówiące, czy kliknieto na mapie, tablica opisów grup, tablica grup, tablica pozycji docelowych dla grup:
Kod: Zaznacz cały
//liczba grup (do zarzadzania - nie licza sie te heli, ani z nalotu)
groups_count = N; //zamiast N wpisz odpowiednia liczbe
//dostepne wezwania
arty_count_left = 3;
heli_count_left = 2;
air_strike_count_left = 1;
//pozycje dla powyzszych
arty_target_pos = [0,0];
heli_taget_pos = [0,0];
air_Strike_pos = [0,0];
group_dest_pos = [0,0];
//znaczniki klikniecia
arty_clicked = false;
heli_cliked = false;
air_strike_cliked = false;
group_dest_clicked = false;
//tablica grup
groups_array = [group d1, group d2, ..., group dN];
//tablica opisow grup (pokaza się w okienku zarzadzania grupami)
groups_descr_array = ["Grupa pancerna 1", "Black Ops", ..., "Vulcany"];
//w tej tablicy wpisujesz typy waypointow, ktore bys chcial miec do dyspozycji (spis: http://community.bistudio.com/wiki/setWaypointType ), np:
waypoint_types = ["MOVE", "DESTROY", "SAD", "GUARD"];
Np w tym samym pliku przydałoby się dodać akcje:
Kod: Zaznacz cały
arty_action = gracz addAction [format["Artyleria (pozostalo:%1)",arty_count_left], "enable_arty.sqf"];
heli_action = gracz addAction [format["Wsparcie AH1 (pozostalo:%1)",heli_count_left], "enable_heli.sqf"];
air_strike_action = gracz addAction [format["Nalot (pozostalo:%1)",air_strike_count_left], "enable_air_strike.sqf"];
manage_group_action = gracz addAction ["Rozkazy dla grup", "enable_manage_group.sqf"];
gdzie gracz to nazwa gracza, bo nie jestem pewny czy komenda player zadziała w init.sqf.
enable_arty.sqf:
Kod: Zaznacz cały
//zmniejszamy ilosc dostepnej arty
arty_count_left = arty_count_left - 1;
gracz removeAction arty_action;
//i jesli pozostala jeszcze dostepna arty, to ja znow dodajemy
if( arty_count_left > 0 )then{
arty_action = gracz addAction [format["Artyleria (pozostalo:%1)",arty_count_left], "enable_arty.sqf"];
};
//wychwytujemy klikniecie na mapie
TitleText["Kliknij na mapie, by zaznaczyc obszar do ostrzalu", "PLAIN DOWN"];
onMapSingleClick "arty_target_pos = [_pos select 0, _pos select 1]; onMapSingleClick""""; arty_clicked = true; ";
//czekaj az gracz kliknie
waitUntil { arty_clicked };
//zresetuj zmienna dla nastepnego razu
arty_clicked = false;
//mozna tu stworzyl jakis marker zeby byla pewnosc (komedna createMarker)
//wywolanie skryptu artylerii, ktorych na sieci jest duzo - pozycja do ostrzalu znajduje sie w zmiennej arty_target_pos
//po jakims czasie jesli stworzono marker ostrzalu, to go usunac
enable_heli.sqf/enable_air_strike.sqf
Kod: Zaznacz cały
//w sumie tak samo jak wczesniejszy skrypt, tylko z innymi zmiennymi
//stworzenie heli/samolotu jesli nie byl wczesniej stworzony i nakierowanie go na pozycje uzyskana z klikniecia
//usuniecie heli/samolotu z goracego terenu
co do zarządzani grupami, to może luknij na to cudo:
http://www.armaholic.com/page.php?id=1976
albo stwórz okienko do zarządzania:
description.ext (zdefiniowanie okienka)
Kod: Zaznacz cały
#define CT_BUTTON 1
#define GUI_COMBO 4
#define ST_CENTER 0x02
#define FontM "Zeppelin32"
class GUIList
{
style = ST_CENTER;
idc = -1;
colorText[] = { 0, 0, 0, 1 };
colorBackground[] = { 0.7, 0.7, 0.0, 0.75 };
colorSelect[] = {0.7, 0.7, 0.0, 1.0};
colorSelectBackground[] = {0,0,0,1};
font = FontM;
sizeEx = 0.016;
rowHeight = 0.03;
soundSelect[] = {"",0.1,1};
soundExpand[] = {"",0.1,1};
soundCollapse[] = {"",0.1,1};
w = 0.275;
h = 0.03;
};
class GUIComboBox:GUIList
{
type = GUI_COMBO;
wholeHeight = 0.4;
};
class GroupManagerDialog{
idd = 100;
movingEnable = false;
controlsBackground[] = { };
objects[] = { };
controls[] = {Background, GroupsCombo, WaypointCombo, OrderButton, CloseButton };
class AbstractButton : RscButton{
idc = -1;
type = CT_BUTTON;
style = ST_CENTER;
w = 0.12; h = 0.03;
colorText[] = { 0, 0, 0, 1 };
colorBackground[] = { 0.7, 0.7, 0.0, 0.75 };
colorDisabled[] = {0.5, 0.5, 0.5, 0.5};
colorFocused[] = {0.9, 0.96, 0.0, 0.75};
colorShadow[] = {0.1, 0.1, 0.0, 0.5};
offsetX = 0.01;
offsetY = 0.01;
offsetPressedX = 0.005;
offsetPressedY = 0.005;
colorBorder[] = {0.9, 0.3, 0.0, 0.9};
borderSize = 0.0;
colorBackgroundActive[] = {0.8, 0.8, 0.0, 0.8};
colorBackgroundDisabled[] = {0.2, 0.2, 0.2, 0.75};
font = FontM; sizeEx = 0.016;
soundEnter[] = { "", 0, 1 };
soundPush[] = { "", 0, 1 };
soundClick[] = { "", 0, 1 };
soundEscape[] = { "", 0, 1 };
}
class Background: RscText
{
x = 0.25;
y = 0.27;
//tu trzeba troche powiekszyc obszar tla:
w = 0.04 + 0.46;
h = 0.04 + 0.16;
text = "";
colorBackground[] = {0.1, 0.1, 0.1, 0.3};
};
class GroupsCombo: GUIComboBox{
idc = 101;
x = 0.29; y = 0.30;
};
class WaypointCombo: GUIComboBox{
idc = 102;
x = 0.29; y = 0.41;
};
class OrderButton : AbstractButton {
idc = 103;
text = "Wydaj rozkaz";
action = "";
x = 0.29; y = 0.49;
};
class CloseButton : AbstractButton {
text = "Anuluj";
action = "closeDialog 100";
x = 0.59; y = 0.49;
};
}//GroupMangerDialog
enable_manage_group.sqf: (obsługa okienka)
Kod: Zaznacz cały
createDialog "GroupManagerDialog";
//wypełnienie 1. comboboxa opisami grup:
//id comboboxa grup to 101 (patrz: description.ext)
for[{_i=0},{_i<groups_count},{_i=_i+1}]do
{
_ind = lbAdd[101, groups_descr_array select _i];
lbSetValue [101, _ind, _i];
};
lbSetCurSel [101, 0];
//wypełnienie 2. comboboxa typami waypointow:
//id tego comboboxa grup to 102 (patrz: description.ext)
for[{_i=0},{_i<(count _types)},{_i=_i+1}]do
{
_ind = lbAdd[102, waypoint_types select _i];
lbSetValue [102, _ind, _i];
};
lbSetCurSel [102, 0];
//ustawienie akcji dla przycisku order, ktory uruchomi skrypt w postaci:
//[nr_grupy, typ_waypointa] execVM "send_order.sqf"
_action = "[lbValue [101, (lbCurSel 101)], lbValue [102, (lbCurSel 102)]] execVM ""send_order.sqf""; closeDialog 100";
//id tego przycisku to 103 (patrz: description.ext)
buttonSetAction [103, _action];
send_order.sqf
Kod: Zaznacz cały
_group_ind = _this select 0;
_group = groups_array select _group_ind;
_waypoint_type_ind = _this select 1;
//to nie to samo, co waypoint_typeS:
waypoint_type = waypoint_types select _waypoint_type_ind;
TitleText[format["Kliknij na mapie, by ustawic miejsce docelowe dla grupy: (%1)",groups_descr_array select _group_ind], "PLAIN DOWN"];
onMapSingleClick "group_dest_pos = [_pos select 0, _pos select 1]; onMapSingleClick""""; group_dest_clicked = true; ";
//czekaj az gracz kliknie
waitUntil { group_dest_clicked };
//zresetuj zmienna dla nastepnego razu
group_dest_clicked = false;
//mozna tu stworzyl jakis ladny marker z opisem ze to dla tej grupy
//stworzenie waypointu - komendy addWaypoint, setWaypointType -grupa w tym skrypcie to _group, typ waypointu to waypoint_type a pozycja docelowa to group_dest_pos
Zmiana flagi i markerów przy wyczyszczeniu miasta:
-nazwać flage jakos sensownie, nazwac marker jakos sensownie
-stworzyc wyzwalacz aktywowany nieobecnoscia jednostek wroga, ktory aktywuje skrypt w postaci:
Kod: Zaznacz cały
siakis_ptr = [flaga, marker] execVM "area_is_clean.sqf"
area_is_clean.sqf
Kod: Zaznacz cały
//zmiana tekstury flagi
//zmiana koloru markera
Prawie na pewno się gdzieś machnąłem przy takiej ilości tekstu