Jump to content
esfumato

Newbie wants to create MP game Mode.

Recommended Posts

I will post a general desing about 1 of the desings I have in mind.

The first one, and the easiest, is an Infantry MP game mode similar to Red Orchestra or Day of Defeat.

The Place.

Ii's just about building a town in Altis using X-Cam Mod by Silola, between Zaros and Therisa towns. It is a flat area of Altis with some earth roads with no buildings and a size of 1.1 x 1.1 kilometers, so it could fit for my pourposes.

Gameplay.

As I said I want 4 teams NATO CSAT AAF and FIA (civilians with FIA gear).

Start Points should be selected at start at random. (So there is 24 diferent combinations of starting points)

Max Players As the game mode is designed only for infantry maybe it can handle lots of players maybe 20 players per team, 80 players in game.

Objective: Capture the town. The town should have 12 Points represented with 12 High capturable Buildings. Yellow squares at image.

Respawn. I would like to have a Wave respawn, as Red Orchestra or Day of Defeat, the first teammate who dies start a countdown and at the end of the countdown all the dead players of the team respawn at once.

Respawn Point The respawn points are moving from the start position to a closer position to the captured zones the team already have, so the teams are pushing each other outside of the town.

Wining Condition: The team that capture 7 of the 12 Capturable buildings win the match.

I am waiting for x-cam mod or the BIS 3D Editor to start doing the town. I tryed once with zeus giving something like this.

If someone could give me some lessons to achieve something like that the help ould be welcome.

 

Best advice is just to experiment and learn. After creating my first SP/COOP mission, I challenged myself to make a MP mission: https://forums.bistudio.com/topic/189527-mp-battle-cars-16-player-vehicle-deathmatch/[shameless plug]. It's been slow going because I've been learning while developing. You really have to just put things out there and try.

 

A good pointer though, from one novice to another, is to hammer down the specifics of your design. Having a basic understanding of your gameflow helps immensely with translating it into the scripting you need for your mission.

 

One thing I will point out is that you might want to watch out with the number assets you are putting down, it may cause serious issues for players.

 

Anywho, good luck!

Share this post


Link to post
Share on other sites

Developing a game mode is not about placing a town in flat area of a map, but about mission dynamics, speed and audience. Mp game for ones who just relax after work, and MP mode for ones who is thursty for hardcore simulation are very big differencies.

Planning a game mode - is a stage with paper and pencil, designing the experience the player will get joining the server running your mission.

When the concept is ready (in details) you can approach technical side of this challenge. And this requires times and practice, from simple to complex things, as engine has about 1000+ stock commands and scripts, it is vital to understand its internals, test things and code, code,code.

this is why we do not have much variety of MP game modes.

This is just another chance to show that you are starting from a wrong place.

PS if you have a good game concept, community will accept, I am sure you will find people who will help to implement that mission. But I see not concept here.

 

I see game here.

image.jpg

UW_map.jpg

Share this post


Link to post
Share on other sites
Guest

I see game here.

image.jpg

UW_map.jpg

 

Please, buy a server. Put your mission in. Give us the link here. Wait for feedback and let's see.

If you are narrow-minded and don't accept others advices then you don't understand the goal of a community/helping forum.

I'm just waiting for a link. And if your mission is crap, everyone here will laugh hard because we warned you and gived you advices that you apparently don't care about.

Share this post


Link to post
Share on other sites

Please, buy a server. Put your mission in. Give us the link here. Wait for feedback and let's see.

If you are narrow-minded and don't accept others advices then you don't understand the goal of a community/helping forum.

I'm just waiting for a link. And if your mission is crap, everyone here will laugh hard because we warned you and gived you advices that you apparently don't care about.

 

I only ask for help, And the only guy that have helped me is Grimes 3D all the other post are just links to the BIS Wiki... you know I know reading already what I need is some help. Something I don't see here anywhere.

Share this post


Link to post
Share on other sites

I'm having trouble with the sectors, The sectors that appear in my mission can be captured by animals! rabbits, snakes that are inside the sectors are taked into a count for the condition of the sector capture.

I am using the script from conq3st mission by wildw1ng

/* yield time */

_yieldtime = LIB_mp_yieldtime;

/* determine side and create markers */
{
    _flag = _x;

    /* sector */

    _sector = createTrigger ["EmptyDetector", getPosATL _flag];
    _sector setTriggerArea [LIB_mp_sectorsize, LIB_mp_sectorsize, 0, false];
    _sector setTriggerActivation ["ANY", "PRESENT", true];
    _sector setTriggerStatements ["this", "", ""];
    _flag setVariable ["sector", _sector];
    _flag setVariable ["seizetime", LIB_mp_seizetime, true];

    /* sector marker */

    _marker = createMarker [format ["sectorMarker%1", _forEachIndex + 1], getPos _flag];
    _marker setMarkerShape "ELLIPSE";
    _marker setMarkerBrush "Solid";
    _marker setMarkerSize [triggerArea _sector select 0, triggerArea _sector select 1];
    LIB_mp_markers set [count LIB_mp_markers, _marker];
    _flag setVariable ["marker", _marker];

    /* sector border marker */

    _bordermarker = createMarker [format ["sector%1border", _forEachIndex + 1], getPos _flag];
    _bordermarker setMarkerShape "ELLIPSE";
    _bordermarker setMarkerBrush "Border";
    _bordermarker setMarkerSize [(triggerArea _sector select 0) + 0.2, (triggerArea _sector select 1) + 0.2];

    /* flag owner and texture */

    _side = sideEnemy;
    if (!LIB_mp_flagsneutral) then
    {
        switch (typeOf _x) do
        {
            case "FlagBlue" : {_side = west;};
            case "FlagRed" : {_side = east;};
            case "FlagGreen" : {_side = resistance;};
            case "FlagCiv" : {_side = civilian;};
        };
    };
    _color = "ColorWhite";
    _texture = "a3\data_f\Flags\flag_white_co.paa";
    if (_side != sideEnemy) then
    {
        _color = LIB_mp_sidecolors select (LIB_mp_activesides find _side);
        _texture = LIB_mp_flagtextures select (LIB_mp_activesides find _side);
    };
    _flag setVariable ["side", _side, true];
    _marker setMarkerColor _color;
    _flag setFlagTexture _texture;
} forEach LIB_mp_flags;

_emptytimer = 0;

/* loop */
_step = 0.2;
_wait = _step;
while {true} do
{
    waitUntil {time >= _wait + _step && !LIB_mp_cutscene};
    _wait = _wait + _step;
    {
        _flag = _x;
        _sector = _flag getVariable "sector";
        _side = _flag getVariable "side";
        _marker = _flag getVariable "marker";
        _seizetime = _flag getVariable "seizetime";
        /* relocate flag if building under it collapses */
        if (getPos _flag select 2 > (_flag getVariable "flagz")) then
        {
            _flag setPos [getPos _flag select 0, getPos _flag select 1, (getPosATL _flag select 2) - (getPos _flag select 2)];
            _flag setVariable ["flagz", getPos _flag select 2];
        };
        /* sort units by their side */
        _dominantside = sideEnemy;
        _unitsperside = [];
        _dominationperside = [];
        if (count list _sector > 0) then
        {
            {
                _unitsperside set [count _unitsperside, []];
                _dominationperside set [count _dominationperside, 0];
            } forEach LIB_mp_activesides;
            {
                _unit = _x;
                if (alive _unit && side _unit in LIB_mp_activesides && vehicle _unit == _unit) then
                {
                    _index = LIB_mp_activesides find side _unit;
                    _units = [];
                    if (_unit isKindOf "Man") then
                    {
                        _units = [_unit];
                    };
                    _unitsperside set [_index, (_unitsperside select _index) + _units];
                    _dominationperside set [_index, (_dominationperside select _index) + count _units];
                };
            } forEach list _sector;
            _sorted = (+ _dominationperside) call BIS_fnc_sortNum;
            _maxindex = (count _sorted) - 1;
            if ((_sorted select _maxindex) > (_sorted select (_maxindex - 1))) then
            {
                _dominantside = LIB_mp_activesides select (_dominationperside find (_sorted select _maxindex));
                if (_dominantside != _side) then
                {
                    _seizetime = (_seizetime - _step) max 0;
                }
                else
                {
                    if (_emptytimer >= 3) then
                    {
                        _seizetime = LIB_mp_seizetime;
                        _emptytimer = 0;
                    }
                    else
                    {
                        _emptytimer = _emptytimer + _step;
                    };
                };
                _flag setVariable ["seizetime", _seizetime, true];
                _multiplier = _seizetime / LIB_mp_seizetime;
                _marker setMarkerSize [(triggerArea _sector select 0) * _multiplier, (triggerArea _sector select 1) * _multiplier];
            };
        };
        if ({_x == 0} count _dominationperside == count _dominationperside) then
        {
            if (_seizetime != LIB_mp_seizetime) then
            {
                if (_emptytimer >= 3) then
                {
                    _seizetime = LIB_mp_seizetime;
                    _flag setVariable ["seizetime", _seizetime, true];
                    _marker setMarkerSize [triggerArea _sector select 0, triggerArea _sector select 1];
                    _emptytimer = 0;
                }
                else
                {
                    _emptytimer = _emptytimer + _step;
                };
            };
        };
        /* flag captured */
        if (_flag getVariable "seizetime" == 0 && _dominantside != _side) then
        {
            _side = _dominantside;
            _flag setVariable ["side", _side, true];
            _index = LIB_mp_activesides find _side;
            _sidecolor = LIB_mp_sidecolors select _index;
            LIB_mp_taken = [_flag, _side];
            publicVariable "LIB_mp_taken";
            [[], LIB_mp_taken] call _takenmessage;
            _flag setVariable ["seizetime", LIB_mp_seizetime, true];
            _marker setMarkerSize [triggerArea _sector select 0, triggerArea _sector select 1];
            _flag setFlagTexture (LIB_mp_flagtextures select _index);
            {_flag getVariable _x setMarkerColor _sidecolor;} forEach ["marker"];
            {_x addScore 0;} forEach (_unitsperside select (LIB_mp_activesides find _side));
        };
    } forEach LIB_mp_flags;
    /* score yield */
    if (time >= _yieldtime) then
    {
        {
            _side = _x;
            _yield = (({_x getVariable "side" == _side} count LIB_mp_flags)) max 0;
            LIB_mp_scores set [_forEachIndex, (LIB_mp_scores select _forEachIndex) + _yield];
            publicVariable "LIB_mp_scores";
        } forEach LIB_mp_activesides;
        _yieldtime = _yieldtime + LIB_mp_yieldtime;
    };
};

Share this post


Link to post
Share on other sites
Guest

enableEnvironment false; ?

Share this post


Link to post
Share on other sites

 

                if (alive _unit && side _unit in LIB_mp_activesides && vehicle _unit == _unit) then

                {

                    _index = LIB_mp_activesides find side _unit;

                    _units = [];

                    if (_unit isKindOf "Man") then

                    {

                        _units = [_unit];

                    };

                    _unitsperside set [_index, (_unitsperside select _index) + _units];

                    _dominationperside set [_index, (_dominationperside select _index) + count _units];

                };

 

Why this don't work?

Share this post


Link to post
Share on other sites

You can launch game with -showScriptErrors key, which enables on-screen script error reporting. Also errors logged in *.rpt files in arma application data directory (c:\Users\USERNAME\AppData\Local\Arma 3\).

Share this post


Link to post
Share on other sites

OK, I am using the script from the mission Conqu3st by wildw1ng.

 

So his script adds 1 point every 30 secons per every flag that 1 team is holding, and the winner is the first team that reach X points.

 

So, I want to change this so the team that wins is the first that conquer 7 of 12 sectors. No points involved.

 

The way i was thinking is to limit the winning condition to 7 "points" ( you can only reach seven points if you hold at once 7 sectors) and make the interval for the points infinite...

 

Any better way to do this without the use of that script?

Share this post


Link to post
Share on other sites

Maybe just use triggers?  Have your 12 triggers (well, 24 for two sides) each "BLUFOR PRESENT" (repeatedly) or whatever then another trigger checking for seven of them to be activated.

 

Condition of:

{triggerActivated _x} count [triggerB0, triggerB1, ..., triggerB11] > 6

So if BLUFOR gets people into 7 of the trigger areas they win.  Same for OPFOR and their set of triggers.  Play around with COUNTDOWN or TIMEOUT if you want them to remain in for x amount of time.

Share this post


Link to post
Share on other sites

I found the script parts.

 

 

conqu3stInit.sqs
 

;C&H score yield interval
LIB_mp_yieldtime = 30

 

 

conqu3st.sqf

 

/* init score array */

LIB_mp_scores = [];
{
    LIB_mp_scores set [count LIB_mp_scores, 0];
} forEach LIB_mp_activesides;

 

/* yield time */

_yieldtime = LIB_mp_yieldtime;

 

 

  /* score yield */
    if (time >= _yieldtime) then
    {
        {
            _side = _x;
            _yield = (({_x getVariable "side" == _side} count LIB_mp_flags)) max 0;
            LIB_mp_scores set [_forEachIndex, (LIB_mp_scores select _forEachIndex) + _yield];
            publicVariable "LIB_mp_scores";
        } forEach LIB_mp_activesides;
        _yieldtime = _yieldtime + LIB_mp_yieldtime;
    };

Share this post


Link to post
Share on other sites

OK, I am using the script from the mission Conqu3st by wildw1ng.

 

So his script adds 1 point every 30 secons per every flag that 1 team is holding, and the winner is the first team that reach X points.

 

So, I want to change this so the team that wins is the first that conquer 7 of 12 sectors. No points involved.

 

The way i was thinking is to limit the winning condition to 7 "points" ( you can only reach seven points if you hold at once 7 sectors) and make the interval for the points infinite...

 

Any better way to do this without the use of that script?

 

I found the script parts.

 

conqu3stInit.sqs

 

;C&H score yield interval

LIB_mp_yieldtime = 30

 

 

conqu3st.sqf

 

/* init score array */

LIB_mp_scores = [];

{

    LIB_mp_scores set [count LIB_mp_scores, 0];

} forEach LIB_mp_activesides;

 

/* yield time */

_yieldtime = LIB_mp_yieldtime;

 

 

  /* score yield */

    if (time >= _yieldtime) then

    {

        {

            _side = _x;

            _yield = (({_x getVariable "side" == _side} count LIB_mp_flags)) max 0;

            LIB_mp_scores set [_forEachIndex, (LIB_mp_scores select _forEachIndex) + _yield];

            publicVariable "LIB_mp_scores";

        } forEach LIB_mp_activesides;

        _yieldtime = _yieldtime + LIB_mp_yieldtime;

    };

 

Share this post


Link to post
Share on other sites

how can I create a server to test my mission on a real multiplayer environment?

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×