Jump to content
  • 0

variable freshSpawn ?!?


Sandbird

Question

I tried to do something in my init.sqf to check freshSpawned players with this:

if (!isDedicated) then {
customscript = compile preprocessFileLineNumbers "freshspawn\custom.sqf";
   if(freshSpawn == 2) then {
     waitUntil {!isNil ("PVDZE_plr_LoginRecord")};
     player spawn customscript;
   };	
};

but i get this error.

if(freshSpawn == 2) then {
waitUntil {!isNi>
  Error position: <freshSpawn == 2) then {
waitUntil {!isNi>
  Error Undefined variable in expression: freshspawn
File mpmissions\__CUR_MP.Chernarus\init.sqf, line 193

I thought the freshSpawn variable was introduced in 1.3.0....Is it taken out in 1.3.0.1 ?

Cause i see it in the player_monitor.fsm and i am not overwriting those file paths

-Thanks

 

ps: I DO NOT want to use     if (dayzPlayerLogin2 select 2) then  ...

That s****t is bugged....it doesnt always return the 3rd parameter (should return false...but its just empty) causing tons of problems.

 

EDIT: I see that freshSpawn is still there...but yea just not working. The variable does not load in init.sqf

 

Did anyone try this before release ?.....

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

The freshSpawn variable is present and I believe you have made a mistake by trying to use the variable before it has even been declared.

Unsure what you are actually doing but to use the variable I suggest moving the code block you have after the player_monitor code but you might still end up using it far earlier than it has been set. If you are sure you know what you are doing then you can place a waitUntil to check freshSpawn > 0. But I recommend testing it as this is just a theoretical stab in the dark.

Link to comment
Share on other sites

  • 0

The freshSpawn variable is present and I believe you have made a mistake by trying to use the variable before it has even been declared.

Unsure what you are actually doing but to use the variable I suggest moving the code block you have after the player_monitor code but you might still end up using it far earlier than it has been set. If you are sure you know what you are doing then you can place a waitUntil to check freshSpawn > 0. But I recommend testing it as this is just a theoretical stab in the dark.

 

That code is in my init.sqf :) How earlier should i get that value ? hehe

I wanna use to check for new people and spawn a bike next to them when they spawn.

Why shouldnt it work at init.sqf?

 

Since other custom spawn scripts get values from when the player selects a gender, then why freshspawn doesnt work when i can see that its getting a value there at gender selection.

I even copied the player_monitor.sqf and .fsm in my client files and overwrite the path BEFORE my function posted...and still i get the error.

I dont think you are right about this one Judge. If its a global variable, then it IS getting initialized before init.sqf reaches that part of the code..so it should be set...but its not.

Link to comment
Share on other sites

  • 0

I believe you might have misunderstood me. I did not say it would not work in the init.sqf. I simply meant that I only see its use in the player_monitor.fsm. This is where it gets declared and initialized. Apart from that I have not been able to find any trace of it. And I saw that you used it riight after this "if (!isDedicated) then {" which makes me believe it is the first thing in your (!isDedicated) code block (of course) this is just a random guess as I cannot really see where in your init it lies.

 

I don't think you need to copy the files over and overwrite the paths and I only think that your code will run fine after the variable is declared and initialized in the player monitor hence why I stated to put it after it. Plus most of the scripts are execVM'd which means they run on their own threads while the init.sqf continues to execute the code in it. Which is why I stated

 

The freshSpawn variable is present and I believe you have made a mistake by trying to use the variable before it has even been declared.

... but you might still end up using it far earlier than it has been set.

 

There is also theses condition states !isNil "sm_done" and "count (dayzPlayerLogin) > 1" in the player monitor a step or two above the 'Parse Login' state and this means execution is stopped until the server has spawned everything it needs and has processed playerLogin and responded. Each taking its own amount of time to complete and respond to the fsm. The freshSpawn variable gets declared in the Parse Login state and hence gets delayed until all the above states get satisfied. Which is also a reason why I thought this would be a game of catchup.

 

(As you can tell this explanation is and can get more elaborate than the simple three lines I wrote earlier :D).

 

Nonetheless, you could simply put a waitUntil in your code block for !(isNil freshSpawn) above if(freshSpawn == 2) then {. This technically should stop execution until freshspawn gets declared.

And since you are using spawn for your script, I would move all this into the top of the script itself and let the init execute the rest of the code rather than wait for freshSpawn.

Link to comment
Share on other sites

  • 0

This is my whole init.sqf.

I initialize it as higher as possible in the init file. Right after _player_monitor.

With the custom spawn script (the graphical one) that was posted here about a week ago, the guy who wrote it added just one variable right after the player clicks the gender.

That variable was used in server_playerSetup.sqf and was passed in the dayzPlayerLogin2 as a 3 argument..

When the player fresh spawned that value was set to true...if he was re- logging then it was not set causing the Waituntil to wait for ever...giving all sorts of problems. Sometimes the players would spawn inside a building in Novy or just get a black screen.

 

I just did what you said....and you wont believe this......freshSpawn is always 0 T_T.

This is my init. and further down the bike script.

startLoadingScreen ["","RscDisplayLoadCustom"];
cutText ["","BLACK OUT"];
enableSaving [false, false];

//REALLY IMPORTANT VALUES
dayZ_instance =	11;//The instance
dayzHiveRequest = [];
initialized = false;
dayz_previousID = 0;
DZE_DiagFpsSlow = true;
dayz_spawnselection = 0; // DayZ Spawnselection / 1 = enabled // 0 = disabled, No current spawn limits. (for GUI spawn script)

//-----------------------------------------------------------------------------------
MissionScript		 = true; // Mission Script
SargeAIScript		 = false; // Sarge AI Framework
R3FAALScript		 = true; // =R3F= Artillery and Logistic (Auto towing)
LoadAdminTools           = false;
BTCLogisticsScript	 = true; // =BTC= Logistic Script (Heli Lift)
BTCFastRopeScript	 = true; // =BTC= Fast Rope
AutoRefuelScript	 = true; // Autorefuel
HouseLightsScript	 = false; // Working House Lighting
TowerLightsScript	 = true; // Illuminant Tower
DebugMonitorScript	 = false; // Debug Monitor
ElevatorScript	 	 = true; // Elevator Script
NoVoiceonSide 	 	 = true; // Side voice Kick Script
BusAIScript		 = false; // Bus AI
SpawnScript		 = true; // SpawnScript 
RealismScript	         = false;
PersonalHeliEvacScript  = true;


//disable greeting menu 
player setVariable ["BIS_noCoreConversations", true];
//disable radio messages to be heard and shown in the left lower corner of the screen
enableRadio true;
// May prevent "how are you civillian?" messages from NPC
enableSentences false;

// DayZ Epoch config
spawnShoremode = 1; // Default = 1 (on shore)
spawnArea= 1500; // Default = 1500
MaxHeliCrashes= 5; // Default = 5
MaxVehicleLimit = 1; // Default = 50
MaxDynamicDebris = 0; // Default = 100
dayz_MapArea = 14000; // Default = 10000
dayz_maxLocalZombies = 30; // Default = 30 

dayz_paraSpawn = false;
DefaultBackpackWeapon = "";
DynamicVehicleDamageLow = 0;
DynamicVehicleDamageHigh = 100;
DynamicVehicleFuelLow = 0;  //10
DynamicVehicleFuelHigh = 100;  //75
DZE_vehicleAmmo = 0;
dayz_maxAnimals = 8; // Default: 8
dayz_minpos = -1; //0
dayz_maxpos = 16000;

DZE_teleport = [99999,99999,99999,99999,99999];

dayz_sellDistance = 40;
dayz_sellDistance_vehicle = 15;
dayz_sellDistance_boat = 30;
dayz_sellDistance_air = 40;
DZE_ForceNameTagsOn = 1;
DZE_BuildingLimit = 250;
dayz_tameDogs = true;

dayz_zedsAttackVehicles = false;

DZE_DeathMsgGlobal = true;
DZE_DeathMsgSide = true;
DZE_DeathMsgTitleText = true;

dayz_fullMoonNights = true;

DefaultMagazines = ["ItemBandage","ItemBandage","ItemPainkiller","ItemMorphine","FoodSteakCooked","ItemSodaCoke","ItemBloodbag","30Rnd_762x39_AK47","30Rnd_762x39_AK47","15Rnd_9x19_M9SD","15Rnd_9x19_M9SD"];
DefaultWeapons = ["ItemMap","ItemWatch","ItemToolbox","ItemFlashlightRed","ItemMachete","M9SD","AK_47_S"];
DefaultBackpack = "DZ_TK_Assault_Pack_EP1";

EpochEvents = [["any","any","any","any",0,"crash_spawner"]];

//Load in compiled functions
call compile preprocessFileLineNumbers "code\init\variables.sqf";				//Initilize the Variables (IMPORTANT: Must happen very early)
progressLoadingScreen 0.1;
call compile preprocessFileLineNumbers "code\init\publicEH.sqf";				//Initilize the publicVariable event handlers
progressLoadingScreen 0.2;
call compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\setup_functions_med.sqf";	//Functions used by CLIENT for medical
progressLoadingScreen 0.4;
call compile preprocessFileLineNumbers "\z\addons\dayz_code\init\compiles.sqf";				//Compile regular functions
progressLoadingScreen 0.5;
call compile preprocessFileLineNumbers "server_traders.sqf";				//Compile trader configs
call compile preprocessFileLineNumbers "dayz_code\init\variables.sqf"; //Initializes custom variables
call compile preprocessFileLineNumbers "dayz_code\init\compiles.sqf"; //Compile custom compiles
call compile preprocessFileLineNumbers "dayz_code\init\settings.sqf"; //Initialize custom clientside settings
progressLoadingScreen 1.0;

building_spawnLoot = compile preprocessFileLineNumbers "code\building_spawnLoot.sqf";
"filmic" setToneMappingParams [0.153, 0.357, 0.231, 0.1573, 0.011, 3.750, 6, 4]; setToneMapping "Filmic";

if (isServer) then {
	//Compile vehicle configs
	call compile preprocessFileLineNumbers "\z\addons\dayz_server\missions\DayZ_Epoch_17.Chernarus\dynamic_vehicle.sqf";				
	// Add trader citys
	_nil = [] execVM "\z\addons\dayz_server\missions\DayZ_Epoch_17.Chernarus\mission.sqf";

	_serverMonitor = 	[] execVM "\z\addons\dayz_code\system\server_monitor.sqf";
	
	"PVDZ_sec_atp" addPublicVariableEventHandler { 
		_x = _this select 1;
		if (typeName _x == "STRING") then {
			diag_log _x;
		}
		else {
			_unit = _x select 0;
			_source = _x select 1;
			if (((!(isNil {_source})) AND {(!(isNull _source))}) AND {((_source isKindOf "CAManBase") AND {(owner _unit != owner _source)})}) then {
				diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters",
					_unit call fa_plr2Str,  _source call fa_plr2Str, _x select 2, _x select 3];
				if (_unit getVariable["processedDeath", 0] == 0) then {
					_unit setVariable [ "attacker", name _source ];
					_unit setVariable [ "noatlf4", diag_ticktime ]; // server-side "not in combat" test, if player is not already dead
				};
			};
		};
	};
};

if (!isDedicated) then {
	//Conduct map operations
	0 fadeSound 0;
	waitUntil {!isNil "dayz_loadScreenMsg"};
	dayz_loadScreenMsg = (localize "STR_AUTHENTICATING");

	//Run the player monitor
	_id = player addEventHandler ["Respawn", {_id = [] spawn player_death;}];
	_playerMonitor = 	[] execVM "\z\addons\dayz_code\system\player_monitor.sqf";	

if(SpawnScript)then{
    _nil = [] execVM "newspawn\bike.sqf";
};



	if(PersonalHeliEvacScript)then{	
		_nil = [] execVM "custom\JAEM\EvacChopper_init.sqf";
	};
	
	if(RealismScript)then{	
		_void = [] execVM "R3F_Realism\R3F_Realism_Init.sqf";
	};
		
	_nil = [] execVM "custom\remote_messages.sqf";
	[] execVM "custom\UnlockDoorFix.sqf";
	[] execVM "custom\service_point\service_point.sqf";	
	
	[] spawn {
		waitUntil {!isNil "dayz_animalCheck"};
		_nil = [] execVM "custom\kh_specials.sqf";
	};
	//anti Hack
	//[] execVM "\z\addons\dayz_code\system\antihack.sqf";

	//Lights
	//[0,0,true,true,true,58,280,600,[0.698, 0.556, 0.419],"Generator_DZ",0.1] execVM "\z\addons\dayz_code\compile\local_lights_init.sqf";
};

//#include "\z\addons\dayz_code\system\REsec.sqf"
//Start Dynamic Weather
//execVM "\z\addons\dayz_code\external\DynamicWeatherEffects.sqf";
execVM "custom\DynamicWeatherEffects.sqf";

#include "\z\addons\dayz_code\system\BIS_Effects\init.sqf"

if(LoadAdminTools)then{
	[] execVM "admintools\Activate.sqf";
};

if(BTCLogisticsScript)then{
_logistic = execVM "=BTC=_Logistic\=BTC=_Logistic_Init.sqf";
};

if(BTCFastRopeScript)then{
sleep 1; _fast_rope = [] execVM "=BTC=_fast_roping\=BTC=_fast_roping_init.sqf";
};

if(R3FAALScript)then{
execVM "R3F_ARTY_AND_LOG\init.sqf";
};

if(SargeAIScript)then{
call compile preprocessFileLineNumbers "addons\UPSMON\scripts\Init_UPSMON.sqf";
call compile preprocessFileLineNumbers "addons\SHK_pos\shk_pos_init.sqf";
[] execVM "addons\SARGE\SAR_AI_init.sqf";
};

if(MissionScript)then{
[] execVM "faction.sqf";
[] execVM "debug\addmarkers.sqf";
[] execVM "debug\addmarkers75.sqf";
};

if(AutoRefuelScript)then{
[] execVM "custom\kh_actions.sqf";
};

if(BusAIScript)then{
if (isServer) then {
	//Bus Route
	[true] execVM "busroute\init_bus.sqf";
};
if (!isDedicated) then {
	//Bus Route
	[] execVM "busroute\player_axeBus.sqf";
};
};

if(TowerLightsScript)then{
	[] execVM "custom\tower_lights.sqf";
};

if(HouseLightsScript)then{
	[] execVM "custom\house_lights.sqf";
};
	
if(DebugMonitorScript)then{
[] execVM "custom\debugmonitor.sqf";
};

if(ElevatorScript)then{
if (!isDedicated) then {
	["elevator"] execVM "elevator\elevator_init.sqf";
}
};


if(NoVoiceonSide)then{
	[] execVM "custom\nosidechat.sqf";
};

//[] execVM "custom\AntiTheftFriends.sqf";
// Safezones
_nil = [] execVM "safezones\init.sqf";

//Teargas
_null = [] execVM "custom\teargas.sqf";

if (!isDedicated) then {
[] execVM "custom\welcome.sqf";
};

call compile preprocessFileLineNumbers "custom\zombietruck\init.sqf";
//execVM "debug.sqf";


//DayZ Watermark
dayZ_serverName = "GROF";
if (!isNil "dayZ_serverName") then {
    [] spawn {
        waitUntil {(!isNull Player) and (alive Player) and (player == player)};
        waituntil {!(isNull (findDisplay 46))};
        5 cutRsc ["wm_disp","PLAIN"];
        ((uiNamespace getVariable "wm_disp") displayCtrl 1) ctrlSetText dayZ_serverName;
    };
};

and the bike:

 

newspawn\bike.sqf

diag_log("####### Spawn script Start");
waitUntil {!isNil ("freshSpawn")};
diag_log format["####### Spawn script value: %1", freshSpawn];
if (freshSpawn == 2) then {
	waitUntil {!isNil ("PVDZE_plr_LoginRecord")};
	private["_ebayspawnvehicle"];
	//-----------vehcile spawn----------------------------------------------------
	titleText ["A bike spawned next to you! (it wont save after restart)", "PLAIN DOWN", 5];
	sleep 2;
	titleFadeOut 1;
	_ebayspawnvehicle = 'Old_bike_TK_INS_EP1' createVehicle (position player);
	_ebayspawnvehicle setVariable ["Mission",1,true];
	clearMagazineCargo _ebayspawnvehicle;
	clearWeaponCargo _ebayspawnvehicle;
};

Log file shows:

"DEBUG: loadscreen guard started."
"DEBUG: loadscreen guard started."
"Started executing user settings file."
"Finished executing user settings file."
"DEBUG: loadscreen guard started."
"DEBUG: loadscreen guard started."
"####### Spawn script Start"
"Res3tting B!S effects..."
"AC_functions version 1"
"DAYZ: CLIENT IS RUNNING DAYZ_CODE "1.0.3.1""
ZOMBIE TRUCK: initializing...
"evaluation of ac_functions.sqf skipped, active version 1 is newer or equal than this file (version 1)"
"Elevator script initialized"
"Running "kh_actions"."
ZOMBIE TRUCK: waiting for login...
"PLAYER RESULT: true"
"####### Spawn script value: 0"

Dont you just love Arma engine ?

Tested it with fresh spawn and relogin after...same value....0

Link to comment
Share on other sites

  • 0

Ah! Well I believe the value always being 0 is my fault. :o

I should have realized it but this fires when the value gets initialized

waitUntil {!isNil ("freshSpawn")};

 

Which would be in its declaration freshSpawn = 0;

So it will always be 0 in this case.

 

So we need to run the script at state "Phase One" of the fsm. Then, I have one more suggestion.. change the start of your bike.sqf file like so

diag_log("####### Spawn script Start");
waitUntil {(!isNil ("freshSpawn")) && (!isNil "dayzPlayerLogin2")};
diag_log format["####### Spawn script value: %1", freshSpawn];
if ((freshSpawn == 2) && (dayzPlayerLogin2 > 0)) then {

This should delay execution of your script long enough for the variable to be declared and set.

Link to comment
Share on other sites

  • 0

Yeah that didnt work,  dayzPlayerLogin2  is set to any...

I also did this to see the values, but i spawned inside a building in Novy again...

waitUntil {(!isNil 'dayz_Totalzedscheck') || (!isNil 'dayz_locationCheck') || (!isNil 'dayzplayerlogin') || (!isNil 'dayz_animalcheck')};
waitUntil {!isNil ("freshSpawn")};
diag_log format["####### Spawn script: freshSpawn:%1 dayz_Totalzedscheck:%2 dayz_locationCheck:%3 dayzplayerlogin:%4 dayz_animalcheck:%5 dayzPlayerLogin2:%6", freshSpawn, dayz_Totalzedscheck, dayz_locationCheck, dayzplayerlogin, dayz_animalcheck, dayzPlayerLogin2];
if ((freshSpawn == 2) && (dayzPlayerLogin2 > 0)) then

and the log:

freshSpawn:0
dayz_Totalzedscheck:any
dayz_locationCheck:any
dayzplayerlogin:["171",[],[],[0,0,0],true,"1.0.3.1","Survivor2_DZ",true,false,0]
dayz_animalcheck:any
dayzPlayerLogin2:any"
Link to comment
Share on other sites

  • 0

Hey, Sorry I was in a hurry and had to leave and made a mistake in the code i specified.

if ((freshSpawn == 2) && (count dayzPlayerLogin2 > 0)) then

That value is an array sent by the server and I left out the count when typing it out. Silly mistake!

 

Didnt work :/

Its ok, forget about it...i'll just use the Deploy bike script and give them materials on fresh spawn.

Thanks for the help though.

Link to comment
Share on other sites

  • 0

lol, you know this is totally stupid though...i mean...in the changelog they say "New global variable !!! w000t freshspawn...." and noone has even tested it T_T.

Instead they do this dayz_login2 crap, which it doesnt even return false....when its not true...its just empty.

I am starting to feel vindicated that those guys were in jail :P (Arma engine is the worst....even worst than Unity engine)

Link to comment
Share on other sites

  • 0

:D

 

Use PVDZE_plr_LoginRecord it gets declared/instantiated just after the player's GUI and display are loaded so well after freshSpawn is declared and set.

 

Use this at the start of your script

waitUntil {!isNil ("PVDZE_plr_LoginRecord")};

Then check the value of freshSpawn and your good to go.

 

This is the test script.

private ["_dayzIsNil","_freshIsNil","_PVIsNil","_dayzPlayerLoginTime","_freshSpawnTime","_playerLoginRecordTime","_done"];

_dayzIsNil = false;
_freshIsNil = false;
_PVIsNil = false;

diag_log (format["Test Started. Time: %1", diag_tickTime]);
diag_log ("Check Test Started");

if (isNil ("dayzPlayerLogin")) then {
    _dayzIsNil = true;    
};
if (isNil ("freshSpawn")) then {
    _freshIsNil = true;
};
if (isNil ("PVDZE_plr_LoginRecord")) then {
    _PVIsNil = true;
};

diag_log (format["dayzPlayerLogin Nil check: %1.",_dayzIsNil]);
diag_log (format["freshSpawn Nil check: %1.",_freshIsNil]);
diag_log (format["PVDZE_plr_LoginRecord Nil check: %1.",_PVIsNil]);

diag_log ("Check Test End");

if (isNil ("dayzPlayerLogin")) then {
    waitUntil { !isNil ("dayzPlayerLogin") };
    _dayzPlayerLoginTime = diag_tickTime;
}
else {
    _dayzPlayerLoginTime = diag_tickTime;
};
diag_log (format["DayzPlayerLoginTime: %1 Time:%2", dayzPlayerLogin, _dayzPlayerLoginTime]);

waitUntil {!isNil ("freshSpawn")};
_freshSpawnTime = diag_tickTime;
diag_log (format["FreshSpawn: %1 Time: %2", freshSpawn, _freshSpawnTime]);

diag_log (format["Time Diff: %1", (_freshSpawnTime - _dayzPlayerLoginTime)]);

if (isNil ("PVDZE_plr_LoginRecord")) then {
    waitUntil {!isNil ("PVDZE_plr_LoginRecord")};
    _playerLoginRecordTime = diag_tickTime;
}
else {
    _playerLoginRecordTime = diag_tickTime;    
};
diag_log (format["PlayerLoginRecord: %1 Time:%2", PVDZE_plr_LoginRecord, _playerLoginRecordTime]);

diag_log (format["Time Diff: %1",(_playerLoginRecordTime - _freshSpawnTime)]);

if (freshSpawn > 0) then {
    diag_log ("FreshSpawn check after PVDZE.");
    diag_log (format["FreshSpawn: %1 Time: %2",freshSpawn,diag_tickTime]);
};

diag_log ("Test End");

 

This is the results.

Normal spawn.

"Test Started. Time: 110.958"
"Check Test Started"
"dayzPlayerLogin Nil check: true."
"freshSpawn Nil check: true."
"PVDZE_plr_LoginRecord Nil check: true."
"Check Test End"
"DayzPlayerLoginTime: [] Time:112.645"
"FreshSpawn: 0 Time: 136.241"
"Time Diff: 23.596"                    (<--- WTF!?!)
"PlayerLoginRecord: ["XXXXX","169",0] Time:138.638"
"Time Diff: 2.39699"
"Test End"

 

New spawn.

"Test Started. Time: 115.734"
"Check Test Started"
"dayzPlayerLogin Nil check: true."
"freshSpawn Nil check: true."
"PVDZE_plr_LoginRecord Nil check: true."
"Check Test End"
"DayzPlayerLoginTime: [] Time:116.174"
"FreshSpawn: 0 Time: 116.404"
"Time Diff: 0.230003"
"PlayerLoginRecord: ["XXXXX","170",0] Time:123.175"
"Time Diff: 6.771"
"FreshSpawn check after PVDZE."
"FreshSpawn: 2 Time: 123.176"
"Test End"

 

Zombie spawn.

"Test Started. Time: 283.563"
"Check Test Started"
"dayzPlayerLogin Nil check: true."
"freshSpawn Nil check: true."
"PVDZE_plr_LoginRecord Nil check: true."
"Check Test End"
"DayzPlayerLoginTime: [] Time:283.982"
"FreshSpawn: 0 Time: 284.123"
"Time Diff: 0.140991"
"PlayerLoginRecord: ["XXXXX","171",0] Time:288.343"
"Time Diff: 4.22"
"FreshSpawn check after PVDZE."
"FreshSpawn: 1 Time: 288.343"
"Test End"

 

 

P.S - DayzPlayerLoginTime should actually say dayzPlayerLogin. Typed it in a hurry. Couldn't give a damn to fix it.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Discord

×
×
  • Create New...