DM-SC-Anniversary-HB-SE

Mapmaking? Modeling? Discuss all that stuff that's too complicated for most mere mortals here.
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

@Ant :swink:
Yeah right to many teleporters would be confusing the players. :sbigsmile: There will be 8 or 10 teleporters for this map (including for the trials). I have found an idea to solve the problem. I will make a spiral stairs, which lead from the 1st to 2nd floor :scool: .

@Brainpan :swink:
Warp zones are awesome to connect rooms. I tried to make infinity floors, but the problem was that the monsters didn´t attack me behind the warp zone and the mp5 fire didn´t pass the warp zone. That´s why i removed them from map.

Apo :sbigsmile:
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

Can i use the PrevSequenceTrigger multiple times with the same List of Events without using random?
For example:
first round i want to shoot stone 1, then stone 2 and stone 3
next round i want to shoot stone 3 then stone 1 then stone 2
next round.........

I know the question is confusing :sbigsmile:

The teleporters and the warpzones have been removed from map :thumbright:

-------------------------------------
DM-SC-Anniversary-HB-SE
current size: 29,0 MB
status: 79% ready
-------------------------------------


Apo :sbigsmile:
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
DW_Ant
DW Clan Member
Posts: 2670
Joined: Sat Jun 21, 2008 11:00 pm
Location: North Carolina

Apok@lypse wrote:Can i use the PrevSequenceTrigger multiple times with the same List of Events without using random?
For example:
first round i want to shoot stone 1, then stone 2 and stone 3
next round i want to shoot stone 3 then stone 1 then stone 2
next round.........
Sure you can!

If you don't want the events to be randomized, then set the PrevSequenceTrigger's bRandomOrder property to false. Then the trigger will use the order of events you placed in the ListOfEvents property.

From your example stated above, it sounds like you want the order to be randomized after each sequence has been completed. Do you want it to randomly change the order every time it finished its previous sequence?
The current version you have cannot change order every time the sequence has been completed, but I can modify that so it will do so. I just want to make sure I got the question right before I start implementing.
The difference between successful people from others is
not in the lack of strength,
not in the lack of knowledge,
but rather in the lack of will.

FFE466

_________________________
{F}{AH}{CivFR}{XC}{U}{DF}{CJ}{SD}
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

Yes right :cheers: .
I need something, like when the order is correct, that a new order comes like the stone example.

Thank you very much for helping Ant :sbigsmile: .
Be on vent next saturday :bigsmurf: .

Apo :sbigsmile:
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
DW_Ant
DW Clan Member
Posts: 2670
Joined: Sat Jun 21, 2008 11:00 pm
Location: North Carolina

Okay I'm assuming you're using this version from Absolute Hell:

Code: Select all

//=============================================================================
// PrevSequenceTrigger
// A sequence trigger will trigger its event whenever all of the tags have been
// triggered.  Other features are included such as randomly generated order, and
// play a sound whenever the right or wrong sequence is triggered.
// Author:  DW>Ant
// Date:  May 5, 2010
//=============================================================================
class PrevSequenceTrigger extends Triggers
    placeable;
    
var()   array<name>     ListOfEvents;   //The sequence of events that must be triggered
var()   bool            bRandomOrder;   //Randomize the order
var()   bool            bRepeatable;    //Do this sequence multiple times
var()   name            ResetEvent;     //Event that is triggered whenever ResetSequence is called (when it fails or repeatable is enabled and the sequence is done)
var()   name            UseTriggerTag;  //The UseTrigger tag that goes along with this.

var(SequenceTriggerConditionalEvents)  string  CompletedMessage;
var(SequenceTriggerConditionalEvents)  sound   CompletedSound;
var(SequenceTriggerConditionalEvents)  string  CorrectMessage;
var(SequenceTriggerConditionalEvents)  sound   CorrectSound;
var(SequenceTriggerConditionalEvents)  string  FailedMessage;
var(SequenceTriggerConditionalEvents)  sound   FailedSound;

var     int             IndexNumber;
var     PrevSequenceUseTriggerRecorder  R;

event PreBeginPlay()
{
    local int   i;
    local bool  Condition;
    local array<name>   TempArray;

    super.PreBeginPlay();

    if (bRandomOrder)
    {
        Condition = true; //initializing

        while (TempArray.length != ListOfEvents.length)
        {
            if (Condition) //To prevent the very small chance of crashing, this condition statement is here so the while loop doesn't go over 10000 iterations
                IndexNumber = Rand(ListOfEvents.length);
            else //Condition is false...incrementing IndexNumber
            {
                if (IndexNumber == ListOfEvents.length - 1)
                    IndexNumber = 0; //Back to the beginning
                else
                    IndexNumber++; //Try next element
                Condition = true; //reset
            }


            //Check to see if this tag was used before
            i = 0; //i is used to compare temp array
            while (i < TempArray.length)
            {
                if (ListOfEvents[IndexNumber] == TempArray[i]) //If this event was used before then get a another tag
                {
                    i = 9999; //Get out of while loop
                    Condition = false;
                }
                else //Check the next element
                    i++;
            }
            if (Condition)  //IndexNumber is good, save it to temp array and get out of loop
                TempArray[TempArray.length]=ListOfEvents[IndexNumber];
            //If Condition is false, then get new IndexNumber (IndexNumber++)
        } //Got randomly generated array, time to reset some variables
        i = 0;
        IndexNumber = 0;

        //Setting ListOfEvents equal to TempArray
        while (i < ListOfEvents.length)
        {
            ListOfEvents[i] = TempArray[i];
            i++;
        }

    }

    //Shuffling is over, going back to normal
    R = Spawn(class 'Mylevel.PrevSequenceUseTriggerRecorder',,'MySequenceUseTriggerRecorder',,);  //Unfortunately mappers are limited to one SequenceTrigger per map.
    R.UseTriggerTag = UseTriggerTag; //Grouping this new actor with this sequence
    Tag = ListOfEvents[0];
}

function Trigger( actor Other, pawn EventInstigator )
{
    if ( (EventInstigator == None && IndexNumber == 0 ) || Other.Tag != UseTriggerTag )
        return; //Do nothing if sequence didn't start or if tags are not matching
    else
    {
        if (GoThroughList())
        {
            if (IndexNumber == ListOfEvents.length-1)  //At end of listed triggers
            {
                PlaySound( CompletedSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
                if (CompletedMessage != "")
                    Level.Game.Broadcast(None, CompletedMessage);
                TriggerEvent(Event, Other, EventInstigator);
                if (bRepeatable)
                {
                    R.ClearHistory();
                    ResetSequence();
                    TriggerEvent(ResetEvent, Other, EventInstigator);
                }
                else
                {
                    R.destroy();
                    destroy();
                }
            }
            else //Move to next list & empty the recorder
            {
                PlaySound( CorrectSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
                if (CorrectMessage != "")
                    Level.Game.Broadcast(None, CorrectMessage);
                IndexNumber++;
                Tag = ListOfEvents[IndexNumber];
                R.ClearHistory();
            }
        }
        else //reset
        {
            PlaySound( FailedSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
            if (FailedMessage != "")
                Level.Game.Broadcast(None, FailedMessage);
            ResetSequence();
            TriggerEvent(ResetEvent, Other, EventInstigator);
        }
    }
}

function bool GoThroughList()
{

    if (IndexNumber == 0) //At the beginning
    {
        R.ClearHistory();
        return true;
    }
    else //Already started the sequence
    {
            if (R.EventHistory[0] == Tag)
                return true;
            else //If the first element isn't matching the tag, someone must of broke the sequence earlier.  Reset
                return false;
    }
}

function ResetSequence()
{
    Tag = ListOfEvents[0];
    IndexNumber = 0;
}

Replace that code with this:

Code: Select all

//=============================================================================
// PrevSequenceTrigger
// A sequence trigger will trigger its event whenever all of the tags have been
// triggered.  Other features are included such as randomly generated order, and
// play a sound whenever the right or wrong sequence is triggered.
// Author:  DW>Ant
// Date:  May 5, 2010
//=============================================================================
class PrevSequenceTrigger extends Triggers
    placeable;
    
var()   array<name>     ListOfEvents;   //The sequence of events that must be triggered
var()   bool            bRandomOrder;   //Randomize the order
var()   bool            bRepeatable;    //Do this sequence multiple times
var()   bool            bShufflePerCompletion;  //If true, the Sequence Trigger will shuffle the list of elements every time the sequence has been completed.
var()   name            ResetEvent;     //Event that is triggered whenever ResetSequence is called (when it fails or repeatable is enabled and the sequence is done)
var()   name            UseTriggerTag;  //The UseTrigger tag that goes along with this.

var(SequenceTriggerConditionalEvents)  string  CompletedMessage;
var(SequenceTriggerConditionalEvents)  sound   CompletedSound;
var(SequenceTriggerConditionalEvents)  string  CorrectMessage;
var(SequenceTriggerConditionalEvents)  sound   CorrectSound;
var(SequenceTriggerConditionalEvents)  string  FailedMessage;
var(SequenceTriggerConditionalEvents)  sound   FailedSound;

var     int             IndexNumber;
var     PrevSequenceUseTriggerRecorder  R;

event PreBeginPlay()
{
    local int   i;
    local bool  Condition;
    local array<name>   TempArray;

    super.PreBeginPlay();

    if (bRandomOrder)
    {
        Condition = true; //initializing

        while (TempArray.length != ListOfEvents.length)
        {
            if (Condition) //To prevent the very small chance of crashing, this condition statement is here so the while loop doesn't go over 10000 iterations
                IndexNumber = Rand(ListOfEvents.length);
            else //Condition is false...incrementing IndexNumber
            {
                if (IndexNumber == ListOfEvents.length - 1)
                    IndexNumber = 0; //Back to the beginning
                else
                    IndexNumber++; //Try next element
                Condition = true; //reset
            }


            //Check to see if this tag was used before
            i = 0; //i is used to compare temp array
            while (i < TempArray.length)
            {
                if (ListOfEvents[IndexNumber] == TempArray[i]) //If this event was used before then get a another tag
                {
                    i = 9999; //Get out of while loop
                    Condition = false;
                }
                else //Check the next element
                    i++;
            }
            if (Condition)  //IndexNumber is good, save it to temp array and get out of loop
                TempArray[TempArray.length]=ListOfEvents[IndexNumber];
            //If Condition is false, then get new IndexNumber (IndexNumber++)
        } //Got randomly generated array, time to reset some variables
        i = 0;
        IndexNumber = 0;

        //Setting ListOfEvents equal to TempArray
        while (i < ListOfEvents.length)
        {
            ListOfEvents[i] = TempArray[i];
            i++;
        }

    }

    //Shuffling is over, going back to normal
    R = Spawn(class 'Mylevel.PrevSequenceUseTriggerRecorder',,'MySequenceUseTriggerRecorder',,);  //Unfortunately mappers are limited to one SequenceTrigger per map.
    R.UseTriggerTag = UseTriggerTag; //Grouping this new actor with this sequence
    Tag = ListOfEvents[0];
}

function Trigger( actor Other, pawn EventInstigator )
{
    if ( (EventInstigator == None && IndexNumber == 0 ) || Other.Tag != UseTriggerTag )
        return; //Do nothing if sequence didn't start or if tags are not matching
    else
    {
        if (GoThroughList())
        {
            if (IndexNumber == ListOfEvents.length-1)  //At end of listed triggers
            {
                PlaySound( CompletedSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
                if (CompletedMessage != "")
                    Level.Game.Broadcast(None, CompletedMessage);
                TriggerEvent(Event, Other, EventInstigator);
                if (bRepeatable)
                {
                    R.ClearHistory();
                    //Shuffle the list every time the sequence was found
                    if (bShufflePerCompletion)
                        ShuffleList();
                    ResetSequence();
                    TriggerEvent(ResetEvent, Other, EventInstigator);
                }
                else
                {
                    R.destroy();
                    destroy();
                }
            }
            else //Move to next list & empty the recorder
            {
                PlaySound( CorrectSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
                if (CorrectMessage != "")
                    Level.Game.Broadcast(None, CorrectMessage);
                IndexNumber++;
                Tag = ListOfEvents[IndexNumber];
                R.ClearHistory();
            }
        }
        else //reset
        {
            PlaySound( FailedSound, SLOT_None, SoundVolume / 255.0, false, SoundRadius, SoundPitch / 64.0);
            if (FailedMessage != "")
                Level.Game.Broadcast(None, FailedMessage);
            ResetSequence();
            TriggerEvent(ResetEvent, Other, EventInstigator);
        }
    }
}

function bool GoThroughList()
{

    if (IndexNumber == 0) //At the beginning
    {
        R.ClearHistory();
        return true;
    }
    else //Already started the sequence
    {
            if (R.EventHistory[0] == Tag)
                return true;
            else //If the first element isn't matching the tag, someone must of broke the sequence earlier.  Reset
                return false;
    }
}

function ResetSequence()
{
    Tag = ListOfEvents[0];
    IndexNumber = 0;
}

function ShuffleList()
{
    local   int             i;
    local   bool            Condition;
    local   array<name>     TempArray;

    Condition = true; //initializing

    while (TempArray.length != ListOfEvents.length)
    {
        if (Condition) //To prevent the very small chance of crashing, this condition statement is here so the while loop doesn't go over 10000 iterations
            IndexNumber = Rand(ListOfEvents.length);
        else //Condition is false...incrementing IndexNumber
        {
            if (IndexNumber == ListOfEvents.length - 1)
                IndexNumber = 0; //Back to the beginning
            else
                IndexNumber++; //Try next element
            Condition = true; //reset
        }


        //Check to see if this tag was used before
        i = 0; //i is used to compare temp array
        while (i < TempArray.length)
        {
            if (ListOfEvents[IndexNumber] == TempArray[i]) //If this event was used before then get a another tag
            {
                i = 9999; //Get out of while loop
                Condition = false;
            }
            else //Check the next element
                i++;
        }
        if (Condition)  //IndexNumber is good, save it to temp array and get out of loop
            TempArray[TempArray.length]=ListOfEvents[IndexNumber];
        //If Condition is false, then get new IndexNumber (IndexNumber++)
    } //Got randomly generated array, time to reset some variables
    i = 0;
    IndexNumber = 0;

    //Setting ListOfEvents equal to TempArray
    while (i < ListOfEvents.length)
    {
        ListOfEvents[i] = TempArray[i];
        i++;
    }
    
    //Assign new tag
    Tag = ListOfEvents[0];
}
This version adds an option to reshuffle the order every time the sequence has been completed. To make this work simply make sure bRepeatable and bShufflePerCompletion is set to true.

Log:
  • Added new function call ShuffleList()
  • Added new boolean variable: bShufflePerCompletion
  • Modified the triggered function to call the ShuffleList() function properly
Note: Due to time constraints, I did not test this modification. I assume it'll be alright since I simply copied the shuffling algorithm to a new function. If you encounter any problems, let me know, and I'll take a better look at it.[/color]
The difference between successful people from others is
not in the lack of strength,
not in the lack of knowledge,
but rather in the lack of will.

FFE466

_________________________
{F}{AH}{CivFR}{XC}{U}{DF}{CJ}{SD}
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

Sorry for asking again Ant :sbigsmile: .

How can i make a mover with this,
First the Mover Key 0 -> Key 1 (Movetime= 0 seconds)
Then Key 1 -> Key 2 (Movetime= 15 seconds)

Thanks for helping :ssmile: .

I found a problem with this movie scene, you know the video that i send you on vent chat. The Complexity is yellow to red :ssad: .

It was a great trial section but i have to make a new one :thumbright:

Apokalypse
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
DW_Ant
DW Clan Member
Posts: 2670
Joined: Sat Jun 21, 2008 11:00 pm
Location: North Carolina

You want to use a custom mover created by Super Ape in his gametype: Old Skool Monsta Adventure.
The custom mover is called VariableTimedMover. Setting it up should be easy. There's an array property in VariableTimedMover category called MoveTimeKey. Simply set the move time numbers to the corresponding moving key. (ie: Element 0 should be the move time between keys 0-1. Element 1 should be the move time between keys 1-2).
Note: I haven't used this actor so I'm not sure how well it will go for you, but it's worth a shot.

You can download OSM-Guide to get a copy of the Variable Timed Mover.

To import OSM content into the actor class browser, make sure the OSM.u is in your system folder. If you don't see the VariableTimedMover option after right clicking the mover button, then go to the actor class browser. Hit file ---> open. Then load up OSM, and the Variable Timed Mover should be available to you.
The difference between successful people from others is
not in the lack of strength,
not in the lack of knowledge,
but rather in the lack of will.

FFE466

_________________________
{F}{AH}{CivFR}{XC}{U}{DF}{CJ}{SD}
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

Thanks again for the OSM Guide Ant :thumbright: . I will try to use this mover for next map ops.

I change my mind with the resident evil trial. I made some new, good and real challenging trials. I will start to build them right now. It´s hard to find some good trials, because of the artifacts. Players could use them to cheat.
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
DW_Ant
DW Clan Member
Posts: 2670
Joined: Sat Jun 21, 2008 11:00 pm
Location: North Carolina

Apok@lypse wrote:I change my mind with the resident evil trial. I made some new, good and real challenging trials. I will start to build them right now. It´s hard to find some good trials, because of the artifacts. Players could use them to cheat.
For flying players, simply place a physics volume over the area you don't want players to fly in. Set the volume's KBuoyancy = 0.999999 (that's six 9's) to disable flying. Use the KBuoyancy in the karma category (not movement).

Limitation volumes for translocating.

Electro Magnet is a bit tricky since it's different per situation. There are multiple solutions but each solution depends on the room structure. You can set teleporters, blocking volumes, nonkarma collision actors, damage volumes, simplified collision models, fake backdrop surfaces, or rough angles (ie: too many corners for a player to spider around) to discourage players from using this artifact.

As for globers, you can either teleport them or kill them by using mover encroachment or using "KillEventInstigator" with scripted trigger's action.

As for Quad Jump + Quick Foot + Air Master + Shield Jump + Power Jump + Speed Combo, you can simply change the gravity, set zone velocity, blocking volumes, teleporters, etc.

As for Iron Legs (fall damage), you can increase terminal speed (max falling speed), damage volume at bottom, or set a scripted trigger with sequence "DamageInstigator" if you want the fall damage to be a one time occurring thing.
The difference between successful people from others is
not in the lack of strength,
not in the lack of knowledge,
but rather in the lack of will.

FFE466

_________________________
{F}{AH}{CivFR}{XC}{U}{DF}{CJ}{SD}
DW_Apok@lypse
DW Clan Member
Posts: 356
Joined: Wed Apr 22, 2009 5:09 am
Xfire: apokalypse86
Location: Leonberg, Germany
Contact:

Thanks again Ant :ssmile: .

Here a short status:
i made a scripted trigger with 140 actions :sbigsmile: and it´s working and a special room (spoiler for moment). Trials are on way for build, i spend to much on the scripted trigger, but i think this map will be one of my best maps, i have ever made in my life :swink: .

Ant, if the map is ready, you want to know the instructions how the maps working? If yes, i will send you a private message after map is ready.

Cya on vent Apo :wave:
Energy-Plant -> Elimination-Chamber -> Crossfire-Xtreme -> Anniversary
Nano-Technics -> Choco-Wars -> Dragon-Tower ->
(Next Map Fall 2016) Survive
Post Reply