Mitspieler Online

· Gäste: 22

· Mitspieler Online: 0

Login

Benutzername

Passwort



Passwort vergessen?
Um ein neues Passwort anzufordern klicke hier.

Ereignisse

<< Mai 2024 >>
Mo Di Mi Do Fr Sa So
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Social

Thema ansehen

 Thema drucken
[Script] Target Rials / Moving Targets
26.02.2014 um 17:14

Top  #1  Beitrag drucken

Steffie

Benutzeravatar
Veteran


Beiträge: 333

Registriert am: 20.06.12

Target Rials / Moving Targets

Ich stand ursprünglich vor dem Problem, dass ich eich Killhouse bauen wollte. Es brauch kein Geheimnis sein, dass das für eine Art S.W.A.T-Missionfür Arma 3 sein sollte. Als ich mir ein Konzept überlegt habe habe ich mich an die Shooting Ranges von Bohemia Interactive erinnert. (ihr wisst schon als es noch keinen Content gab und sie versucht haben uns mit Time Trials an der Stange zu halten ;) ) Jedenfalls gab es da diese beweglichen Ziele, die auf Schienen hin und her gefahren sind, oder auf einen zu. Killhouses und Shooting Ranges gibt es ja mittlerweile zu genüge, aber kaum welche, die bewegliche Ziele verwenden, und wenn doch, dann auf normale Ziele, die auf magische Art und Weise über den Boden gleiten.
Die nötigen Objekte gibt es im Editor, aber wer hat schon Lust sich das für jede Schiene zusammen zu basteln, und dann muss sich das ganze noch bewegen.


Ich habe mir also vorgenommen ein Script zu entwerfen, das benutzerfreundlich automatisch bewegliche Ziele aufbaut und sich bewegen lässt. Über Parameter soll man dann einstellen können, wie lang die Schiene ist, welche Ausrichtung das Ziel hat, wie schnell, wie oft und wann überhaupt es sich bewegt.

YouTube Video


Ein Großer Teil ist geschafft, es läuft ganz passable im Singleplayer. Nun Stehe ich vor der Hürde das Ganze auf dem ded. Server zum laufen zu kriegen.
Knackpunkt ist offensichtlich das ewig nervige Thema Lokalität. Das ganze Konstrukt, da über die Intit-Zeile des ersten Schienenstücks ausgeführt läuft natürlich auf jedem Client, und bei vielen Spielern hat man dann natürlich mehrere Targets, die auf den schienen hin und her fahren, was zwar sehr witzig aussieht, aber nicht wirklich seinen Zweck erfüllt. Noch schöner wird es wahrscheinlich später bei den "Hit"-Event Handlern werden. Ein einfaches "if (!isServer ) exitWith {};" hat das Problem nicht behoben.
(wäre auch zu schön gewesen)

www7.pic-upload.de/26.02.14/83rzznr3bgzv.jpg

Aufgerufen wird das ganze indem man das erste Schienenstück als Objekt im Editor plaziert, und über die Init-Zeile (oder alternativ inti.sqf oder so) das Script "initTargetRailExt.sqf". Das Script baut dann anhand der Parameter die Schiene an das erste Segment und ruft seinerseits das Script "moveTargetRailExt.sqf" auf, was über ein eigenes Array die Bewegung regelt.

Am besten lässt sich das wahrscheinlich an dem Script selbst erkennen. Die Dokumentation ist komplett auf Englisch, weil ich mir offen lassen wollte es zu veröffentlichen.




////////////////////////////////////////////////////////////////////////////////////////////////////////
/*  initTargetRailExt.sqf                                   EXTENDED VERSION                          */
/*  by [W] Steffie                                                                                    */
/*  v1.3, 16.02.14                                                                                    */
/*  required: "nopop=true;" in init.sqf                                                               */
/*            PopUpTarget.sqf            v1.0                                                         */
/*            moveTargetRailExt.sqf      v1.0                                                         */
/*                                                                                                    */
/*  Description:                                                                                      */
/*    This script automatically builds an Popup Target rail                                           */
/*    First Rail segment is used to place startpoint of railway. All other parts are built auto-      */
/*    matically. Movement of the target is controlled by movement-array.                              */
/*    It's possible to start movement by connecting a trigger.                                        */
/*                                                                                                    */
/*  Usage:                                                                                                     */
/*    Target = [Rail,Segm,Dir,Type[Spd,Times,Delay,Downtime,Start,Reset]] execVM "scripts\initTargetRail.sqf"; */
/*                                                                                                             */
/*  Parameters:                                                                                       */
/*    Rail:      Object - First rail segment, sets position an direction of track     ObjVar "_base"  */
/*    Segments:  Number - Count of total segments of rail (1m per Segment)                            */
/*    Direction: Number - 0 to 3, Direction target faces relatively to rail.                          */
/*                        Target starts on 1st rail. Rail 90 deg clockwise.                           */
/*    Type:      Number - Type of Target on Rail an Accuracy feature (2 digits)                       */       
/*    Speed:     Number - Speed of target in m/s.                                                     */
/*    Times:     Number - Times the target passes the rail, 2 means to and back, -1 endless           */
/*    Delay:     Number - Time the target rest at the end of the rails.                               */
/*    Downtime:  Number - Time before Target popping up again (-1 means stay down)                    */
/*    Start:     Object - Trigger, Target sleeps until Trigger fires. No Trigger: objNull             */
/*                                                                                                    */
/*  Examples:                                                                                         */
/*    null = [RL_1,3,0,11[5,2,2,4,trgDoor_1]] execVM "scripts\initTargetRail.sqf";                    */
/*    Short Rail that pops in when triggered, stays 2 sec and pops back. Perfect for doors and windows*/
/*                                                                                                    */
/*    null = [RL_2,8,0,12[3,-1,0,-1,objNull]] execVM "scripts\initTargetRail.sqf";                    */
/*    Target moves permanently, good for Sniper practice.                                             */
/*                                                                                                    */
/*    T_1 = [RL_3,5,3,21[10,1,0,-1,trgDoor_2]] execVM "scripts\initTargetRail.sqf";                   */
/*    Target fast moving forward, good surprise in Kill houses                                        */
/*                                                                                                    */
/*  Helper Type:                                                                                      */
/*    first digit:  Target Type (Moving Target 1 to 3 and Zombie)                                     */
/*    second digit: Accuracy Type (none, accuracy aim, zones)                                         */
/*                                                                                                    */
/*    23 means using Moving Target 2 with Zones     10 uses Moving Target 1 plain                     */
/*    default: 10                                                                                     */
/*                                                                                                    */
/*  Helper Directions:                                                                                */
/*    0) v------   1) <------   2) A------   3) >------   initial direction of 1st rail part is top   */
/*         right     backward         left      forward                                               */
/*                                                                                                    */
/*  Reset nopop-targets:  by Variable Stef_targets_reset      (probably only works with times: -1)    */
/*                                                                                                    */
////////////////////////////////////////////////////////////////////////////////////////////////////////


// reading parameters
_frstRail = _this select 0;    // Object - first rail segment
_Seg = _this select 1;         // Number - number of total rail sections
_targetDir = _this select 2;   // Number - direction the target will face
_type = _this select 3;        // Number - Type of Target on Rail
_moveArr = _this select 4;      // Array  - array that describes type of movement the target will perform.
_target = objNull;             // Object - Movable target
_railArr = [];                 // Array  - Contains all used objects
_downTime = _moveArr select 3;  // Bool   - target will popup on true  (saved as objVar "_nopop")

// building rails

_initPos = getPos _frstRail;   
_aktRail = "Target_Rail_End_F" createVehicle _initPos; // beginning
_aktRail attachTo [_frstRail,[-0.53,0,0]];
_railArr = [_aktRail,_frstRail];

for [{_x=1},{_x<_Seg},{_x=_x+1}] do {                  // rail parts
  _aktRail = "Target_Rail_F" createVehicle _initPos;
  _aktRail attachTo [_frstRail,[_x,0,0]];
  _railArr = _railArr + [_aktRail];
};

_aktRail = "Target_Rail_End_F" createVehicle _initPos; // ending
_aktRail attachTo [_frstRail,[(_Seg - 0.53),0,0]];
_railArr = _railArr + [_aktRail];

// Target_PopUp2_Moving_90deg_F // Target_PopUp2_Moving_90deg_Acc2_F // Target_PopUp2_Moving_90deg_Acc1_F

_type1 = floor (_type / 10);
_type2 = _type mod 10;

// Set type of target texture
_typeStr = switch (_type1) do {
  case 1: {_accStr = "Target_PopUp_Moving"; _accStr};
  case 2: {_accStr = "Target_PopUp2_Moving"; _accStr};
  case 3: {_accStr = "Target_PopUp3_Moving"; _accStr};
  case 4: {_accStr = "Zombie_PopUp_Moving"; _accStr};
  default {_accStr = "Target_PopUp_Moving"; _accStr};
};

// Set Accuracy texture
_accStr = switch (_type2) do {
  case 0: {_accStr = ""; _accStr};
  case 1: {_accStr = "_Acc1"; _accStr};
  case 2: {_accStr = "_Acc2"; _accStr};
  default {_accStr = ""; _accStr};
};

_target = switch (_targetDir) do {
  case 0: // Target moves right
  {
    _target = (_typeStr + _accStr + "_F") createVehicle _initPos;
    _target setPos (_frstRail modelToWorld [-0.1,0,-0.10]);
    _target setDir (getDir _frstRail); _target
  };
  case 2: // Target moves backward
  {
    _target = (_typeStr + _accStr + "_F") createVehicle _initPos;
    _target setPos (_frstRail modelToWorld [-0.1,0,-0.10]);
    _target setDir (getDir _frstRail -180); _target
  };
  case 1: // Target moves left
  {
    _target = (_typeStr + "_90deg" + _accStr + "_F") createVehicle _initPos;
    _target setPos (_frstRail modelToWorld [-0.1,0,-0.10]);
    _target setDir (getDir _frstRail + 90); _target
  };
  case 3: // Target moves forward
  {
    _target = (_typeStr + "_90deg" + _accStr + "_F") createVehicle _initPos;
    _target setPos (_frstRail modelToWorld [-0.1,0,-0.10]);
    _target setDir (getDir _frstRail - 90); _target
  };
};

// Object Variables
_target setVariable ["_downTime", _downTime, true];
_target setVariable ["_down", false, true];
_target setVariable ["_base", _frstRail, true];
_target setVariable ["_objArr", _railArr, true];

_move = [_moveArr,_seg,_target] execVM "scripts\moveTargetRailExt.sqf";

_target // return value is object Target, frstRail is objVar "_base"
        //                                all objects in objVar "_objArr"




.


und dies:


////////////////////////////////////////////////////////////////////////////////////////////////////////
/*  moveTargetRailExt.sqf                                                                             */
/*  by [W] Steffie                                                                                    */
/*  v1.3, 16.02.14                                                                                    */
/*  required: "nopop=true;" in init.sqf                                                               */
/*            PopUpTarget.sqf            v1.0                                                         */
/*            initTargetRailExt.sqf      v1.3                                                         */
/*                                                                                                    */
/*  [[speed,times,delay,nopop,start,reset],segmets,target]                                            */
/*                                                                                                    */
/*  Description:                                                                                      */
/*    This script automatically builds an Popup Target rail                                           */
/*    First Rail segment is used to place startpoint of railway. All other parts are built auto-      */
/*    matically. Movement of the target is controlled by movement-array.                              */
/*    It's possible to start movement by connecting a trigger.                                        */
/*                                                                                                    */
/*  more Information in initTargetRailExt.sqf                                                         */
/*                                                                                                    */
////////////////////////////////////////////////////////////////////////////////////////////////////////

// reading parameters
_movArr = _this select 0;      // Array  - array that describes type of movement the target will perform.
_Seg = _this select 1;         // Number - number of total rail sections
_target = _this select 2;      // Number - direction the target will face
_speed = _movArr select 0;     // Number - Speed n/s
_times = _movArr select 1;     // Number - times
_delay = _movArr select 2;     // Number - time target will rest
_downTime = _movArr select 3;   // Bool   - target will popup on true
_start = _movArr select 4;     // Object - Trigger
_reset = _movArr select 5;     // Object - Trigger
_frstRail = _target getVariable "_base"; // baseRail

// custom hit Eventhandler, default disabled by nopop=true; in init.sqf
_target addEventHandler ["HitPart", {[(_this select 0)] execVM 'scripts\PopUpTargetExt.sqf';}];

// calculating distance for movement
_dist = _Seg - 1 + 2*0.05;
_dw = _speed * 0.01;


// if trigger used, wait until it's triggered
if( !isNull _start ) then {
  _target animate ["terc", 1];
  waitUntil {triggerActivated _start};
  _target animate ["terc", 0];
};

// loop until times over, target not popping up again or endless
_i = 0;  // counting times

while{ (_i < _times || _times == -1)} do {

  _aktw = 0;
 
  // target moving down rail
  while {(_aktw < _dist)  && !(_target getVariable "_down")} do {
 
    _aktw = _aktw + _dw;
    _target setPos (_frstRail modelToWorld [(_aktW - 0.15),0,-0.10]);
    sleep 0.01;
 
  };
 
  _i = _i +1;
  sleep _delay;
 
  // target moving up rail again
  if ( _i < _times || _times == -1) then {  // stop if times over
    while {(_aktw > 0) && !(_target getVariable "_down")} do {
   
      _aktw = _aktw - _dw;
      _target setPos (_frstRail modelToWorld [(_aktW - 0.15),0,-0.10]);
      sleep 0.01;
 
    };
  _i = _i +1;
  sleep _delay;
  };
};

true




Um regeln zu können, wie die Ziel hoch und runter klappen, wird in abgewandelter Form das Bohemia Script "PopUpTarget.sqf" in verbindung mit "nopop = true" in der init.sqf benutzt. Das sollte eher keine Probleme machen.

Da es hier einige sehr erfahrene Programmierer gibt und würde ich mich über Ideen und Vorschläge sehr freuen.
Hier einmal der Download der Mission:

Moving Target Test Mission

Vielleicht konnte ich ja den einen oder anderen von der Idee begeistern.

Grüße, Steffie
Bearbeitet von Steffie am 26.02.2014 um 19:50
Springe ins Forum:
Seitenaufbau in 0.16 Sekunden
Serverzeit: 01:39:04 Uhr , 54,520,653 eindeutige Besuche