OFPEC Forum

Editors Depot - Mission Editing and Scripting => OFP - Editing/Scripting Multiplayer => Topic started by: Strat on 25 Dec 2004, 23:21:26

Title: Multiplayer Random Artillery
Post by: Strat on 25 Dec 2004, 23:21:26
I have used/tried all the artillery strikes on OFPEC, the 3 or 4 that I could find.

I'm having a problem, I set a Helipad(invisible) as what the flak artillery is aiming for. Since it is on the ground, it hits the ground. I've tried changing the Height Command, but it is useless.

This is the script I've found the most easiest to use. (I am the Suber n00b).  I want the flak to hit about 20 or so meters off the ground, so it lights up, but isn't killing off my teammates.

Script Made by Pica

Code: [Select]
;
;Created by Pica
;
;area of flak around target
;random  height of flak
;target aircraft
;game logic name
;ammo to use
;example
;[150,10,blackhawk,log1,"shell73"] exec "flak.sqs"


_area = _this select 0
_height = _this select 1
_target = _this select 2
_logic = _this select 3
_ord = _this select 4



#loop
_where = getpos _target
_logic setpos [(_where select 0) - random _area + random _area, (_where select 1) - random _area + random _area, (_where select 2) + random _height +10]

_bomb = _ord camcreate getpos _logic
_bomb = _ord camcreate getpos _logic

~random 2.5

;you can change the condition below the end
? alive _target : goto "loop"

I'm not sure how many of you are familiar. And if you are wondering, I don't want to use a helicopter, it is a WWII mission. Kind of based on Band of Brothers where they are outside foy, and getting hit with flak.

All help is appreciated.

-Ben
Title: Re:Multiplayer Random Artillery
Post by: Terox on 29 Dec 2004, 13:15:12
try this

1) Create a visible object
2) setpos it to the height you want it
3) save its position as a variable
4) delete the object

use the saved position as the target location for your flak

(I dont think you can setpos logics with height, i believe they just return 2 coordinates)

*********************************************************
STAGE1
create an object in the mission editor, something that you can see, lets say a Danger sign

name it "Target1"

Place the following line in the danger signs init box

this setpos [getpos this select 0, getpos this select 1,10]
adjust the value  10 to increase or decrease the objects height


by previewing the mission, you will be able to get "Target1" exactly where you want it

*********************************************************
STAGE2
Place the following lines in a script eg init.sqs

~0.1
Flakpos = getpos Target1
deletevehicle Target1

*********************************************************
STAGE2
use

Flakpos

as your target location

eg

[150,10,blackhawk,Flakpos,"shell73"] exec "flak.sqs"



*****************************************************************
NB>>>

I believe camcreate is only run locally on a machine
this means, that the randomness of the shell position will be different on each clients (Players) machine, whereas if you have the server run a createvehicle command, the object is seen in the same place on all clients even though only the server ran the script
Title: Re:Multiplayer Random Artillery
Post by: Strat on 30 Dec 2004, 02:15:32
Hey, I really appreciate it. That works wonderful.

-Ben
Title: Re:Multiplayer Random Artillery
Post by: Gnat on 30 Dec 2004, 02:41:56
First note; As Torex suggested, get rid of CAMCREATE ...... it doesnt work correctly for this task in Multiplayer. Replace it with CREATEVEHICLE ..... works perfect then.

Next note;
Sample of my MP Artillery script;
Code: [Select]
_position = _this select 0
_radius = _this select 1

?!(local server) : exit  ; run only on server

_power = "laserguidedbomb"
_mx = (getpos _position select 0)
_my = (getpos _position select 1)
_mz = 0

#Randomize
_dir = random 360
_dis = random _radius
_rx = (sin _dir) * _dis
_ry = (cos _dir) * _dis

#Boom
_Booom = _power createVehicle [(_mx + _rx), (_my + _ry), (_mz)]  

This works for ground strikes. BTW, laserguidedbomb is probably too deadly, use your shell73 instead.
To modify for Air/flak strikes try (untested code);
Code: [Select]
_position = _this select 0       ; Target
_radius = _this select 1         ;blast radius
_AimHigh = _this select 2          ;distance above wanting to miss
_NumRounds = _this select 3        ;number of explosions in one call

?!(local server) : exit           ; run only on server

_power = "shell73"
_mx = (getpos _position select 0)
_my = (getpos _position select 1)
_mz = (getpos _position select 2)

#Randomize
_dir = random 360
_dir2 = random 360
_dis = random _radius
_dis2 = random _radius
_rx = (sin _dir) * _dis
_ry = (cos _dir) * _dis
_rz = (cos _dir2) * _dis2

#Boom
_Booom = _power createVehicle [(_mx + _rx), (_my + _ry), (_mz + _rz + _AimHigh)]

_NumRounds = _NumRounds - 1
?(_NumRounds < 1 ) : exit
~0.2              ; delay between rounds
goto "Randomize"
 

Sample call would be;
[Blackhawk1, 10, 20, 5] exec "Scriptname.sqs"
(Target, Radius, AimHigh, #Rounds)

Hope that was of some help.
Title: Re: Multiplayer Random Artillery
Post by: Clayborne on 22 Jul 2010, 22:52:07
Ok I know this is six years old but it's relevant.

I need a random impact zone in MP so I'm trying to modify an SP script. But Terox said up there that createvehicle is global. Does this mean that if I have only the server run the script, I don't have to make the clients run it too? And the random impacts will be the same for everyone?

I was about to make two seperate scripts so that would help a bunch.
Title: Re: Multiplayer Random Artillery
Post by: RKurtzDmitriyev on 24 Jul 2010, 21:26:06
Hi Clayborne.

Yes, createVehicle is definitely a global command. It will create one vehicle per execution. So if you let all computers execute createvehicle commands in the same place at the same time, you will get 4 or 5 jeeps stacked on top of each other (for example). Only run creation commands on the server.

And yes, the random impact zones will be the same. A shell will not be in more than one place at the same time, unless there's lag. Obviously, it would be best to have all the random processing done on one computer, though.
Title: Re: Multiplayer Random Artillery
Post by: Clayborne on 27 Jul 2010, 12:41:04
Ok, cool.

I'm also using OnMapSingleClick to control the artillery. I haven't used this before but it works fine in SP so far. If anyone could look at this and tell me if it should work in MP that would be helpful.


The Map click command is started like this (got this from another thread here)

Code: [Select]
a = 0
b = 0
clicked = false

onMapSingleClick {a = (_pos select 0); b = (_pos select 1); clicked = true; publicVariable "a"; publicVariable "b"; publicVariable "clicked"; [] exec "Arty1.sqs"}

In the mission, you define the number of rounds you want by using a radio command. At the moment it is 1 or 3. This sets a variable called RoundCount to the desired number and PublicVariables it. This is then passed into the script via Arty1.sqs which looks like this;


Code: [Select]
onMapSingleClick {}
_pos = [a,b,-1]

~2

target setpos _pos  //here I am SetPos'ing a small object which serves as the target marker

[GetPos Target,"Shell125",25,0,ROUNDCOUNT,5,5,3,25] exec "g_arty.sqs"

where g_arty.sqs is the main artillery script. After that, the position (a,b) and 'clicked' values are reset to 0 and publicvariabled,  and the Map click command is defined again in the same fashion.

As long as I exit ?! localserver at the start of these scripts should this work in MP?
Title: Re: Multiplayer Random Artillery
Post by: RKurtzDmitriyev on 27 Jul 2010, 18:32:41
Quote
As long as I exit ?! localserver at the start of these scripts should this work in MP?

Sounds like it. It's hard to tell these things from just reading, to be honest. One way to test is to open two instances of OFP and join your own hosted game. This gives you FADE warning messages, though. I'm not sure if it will damage your copy of OFP.

Another option is to use the free OFP dedicated server program, set up your own server, and then join it. This doesn't activate FADE, but I never understood how to use the dedicated server program. :P

Anyway, although I think your method will work, I did notice a possible area for improvement:

Code: [Select]
target setpos _pos  //here I am SetPos'ing a small object which serves as the target marker
An object setPos'd on one computer will be setPos'd on all computers, so this code seems to make your global variables "a" and "b" redundant. Just use local variables, and the other computers will know the co-ordinates based on the position of the target marker.
Title: Re: Multiplayer Random Artillery
Post by: Clayborne on 27 Jul 2010, 18:51:51
Yeah but don't I need A and B to tell the script where the map click was?
Title: Re: Multiplayer Random Artillery
Post by: RKurtzDmitriyev on 27 Jul 2010, 23:12:59
Yeah but don't I need A and B to tell the script where the map click was?

What's wrong with simply writing

Code: [Select]
onMapSingleClick {target setPos _pos}

???

The target will now necessarily be where the map click was.