mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 02:56:09 -04:00
more of the same
This commit is contained in:
parent
a483f14418
commit
4e7948ed65
63
src/Chat.c
63
src/Chat.c
@ -172,21 +172,21 @@ void Chat_AddRaw(const char* raw) {
|
||||
}
|
||||
void Chat_Add(const String* text) { Chat_AddOf(text, MSG_TYPE_NORMAL); }
|
||||
|
||||
void Chat_AddOf(const String* text, int msgType) {
|
||||
Event_RaiseChat(&ChatEvents_ChatReceived, text, msgType);
|
||||
void Chat_AddOf(const String* text, MsgType type) {
|
||||
Event_RaiseChat(&ChatEvents_ChatReceived, text, type);
|
||||
|
||||
if (msgType == MSG_TYPE_NORMAL) {
|
||||
if (type == MSG_TYPE_NORMAL) {
|
||||
StringsBuffer_Add(&Chat_Log, text);
|
||||
Chat_AppendLog(text);
|
||||
Chat_AppendLogTime();
|
||||
} else if (msgType >= MSG_TYPE_STATUS_1 && msgType <= MSG_TYPE_STATUS_3) {
|
||||
ChatLine_Make(&Chat_Status[msgType - MSG_TYPE_STATUS_1], text);
|
||||
} else if (msgType >= MSG_TYPE_BOTTOMRIGHT_1 && msgType <= MSG_TYPE_BOTTOMRIGHT_3) {
|
||||
ChatLine_Make(&Chat_BottomRight[msgType - MSG_TYPE_BOTTOMRIGHT_1], text);
|
||||
} else if (msgType == MSG_TYPE_ANNOUNCEMENT) {
|
||||
} else if (type >= MSG_TYPE_STATUS_1 && type <= MSG_TYPE_STATUS_3) {
|
||||
ChatLine_Make(&Chat_Status[type - MSG_TYPE_STATUS_1], text);
|
||||
} else if (type >= MSG_TYPE_BOTTOMRIGHT_1 && type <= MSG_TYPE_BOTTOMRIGHT_3) {
|
||||
ChatLine_Make(&Chat_BottomRight[type - MSG_TYPE_BOTTOMRIGHT_1], text);
|
||||
} else if (type == MSG_TYPE_ANNOUNCEMENT) {
|
||||
ChatLine_Make(&Chat_Announcement, text);
|
||||
} else if (msgType >= MSG_TYPE_CLIENTSTATUS_1 && msgType <= MSG_TYPE_CLIENTSTATUS_3) {
|
||||
ChatLine_Make(&Chat_ClientStatus[msgType - MSG_TYPE_CLIENTSTATUS_1], text);
|
||||
} else if (type >= MSG_TYPE_CLIENTSTATUS_1 && type <= MSG_TYPE_CLIENTSTATUS_3) {
|
||||
ChatLine_Make(&Chat_ClientStatus[type - MSG_TYPE_CLIENTSTATUS_1], text);
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,14 +306,13 @@ static void Commands_Execute(const String* input) {
|
||||
*------------------------------------------------------Simple commands----------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
static void HelpCommand_Execute(const String* args, int argsCount) {
|
||||
if (argsCount == 1) {
|
||||
Commands_PrintDefault(); return;
|
||||
}
|
||||
struct ChatCommand* cmd;
|
||||
int i;
|
||||
|
||||
struct ChatCommand* cmd = Commands_GetMatch(&args[1]);
|
||||
if (argsCount == 1) { Commands_PrintDefault(); return; }
|
||||
cmd = Commands_GetMatch(&args[1]);
|
||||
if (!cmd) return;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < Array_Elems(cmd->Help); i++) {
|
||||
if (!cmd->Help[i]) continue;
|
||||
Chat_AddRaw(cmd->Help[i]);
|
||||
@ -346,11 +345,12 @@ struct ChatCommand GpuInfoCommand_Instance = {
|
||||
};
|
||||
|
||||
static void RenderTypeCommand_Execute(const String* args, int argsCount) {
|
||||
int flags;
|
||||
if (argsCount == 1) {
|
||||
Chat_AddRaw("&e/client: &cYou didn't specify a new render type."); return;
|
||||
}
|
||||
|
||||
int flags = Game_CalcRenderType(&args[1]);
|
||||
flags = Game_CalcRenderType(&args[1]);
|
||||
if (flags >= 0) {
|
||||
EnvRenderer_UseLegacyMode( flags & 1);
|
||||
EnvRenderer_UseMinimalMode(flags & 2);
|
||||
@ -383,7 +383,7 @@ static void ResolutionCommand_Execute(const String* args, int argsCount) {
|
||||
Chat_AddRaw("&e/client: &cWidth and height must be above 0.");
|
||||
} else {
|
||||
Window_SetClientSize(width, height);
|
||||
Options_SetInt(OPT_WINDOW_WIDTH, width);
|
||||
Options_SetInt(OPT_WINDOW_WIDTH, width);
|
||||
Options_SetInt(OPT_WINDOW_HEIGHT, height);
|
||||
}
|
||||
}
|
||||
@ -422,16 +422,16 @@ Vector3I cuboid_mark1, cuboid_mark2;
|
||||
bool cuboid_persist, cuboid_hooked;
|
||||
|
||||
static bool CuboidCommand_ParseBlock(const String* args, int argsCount) {
|
||||
int block;
|
||||
if (argsCount == 1) return true;
|
||||
if (String_CaselessEqualsConst(&args[1], "yes")) { cuboid_persist = true; return true; }
|
||||
|
||||
int raw = Block_Parse(&args[1]);
|
||||
if (raw == -1) {
|
||||
block = Block_Parse(&args[1]);
|
||||
if (block == -1) {
|
||||
Chat_Add1("&eCuboid: &c\"%s\" is not a valid block name or id.", &args[1]); return false;
|
||||
}
|
||||
|
||||
BlockID block = (BlockID)raw;
|
||||
if (block >= BLOCK_CPE_COUNT && !Block_IsCustomDefined(block)) {
|
||||
if (block >= BLOCK_CPE_COUNT && !Block_IsCustomDefined((BlockID)block)) {
|
||||
Chat_Add1("&eCuboid: &cThere is no block with id \"%s\".", &args[1]); return false;
|
||||
}
|
||||
|
||||
@ -521,20 +521,19 @@ struct ChatCommand CuboidCommand_Instance = {
|
||||
*------------------------------------------------------TeleportCommand----------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
static void TeleportCommand_Execute(const String* args, int argsCount) {
|
||||
Vector3 v;
|
||||
if (argsCount != 4) {
|
||||
Chat_AddRaw("&e/client teleport: &cYou didn't specify X, Y and Z coordinates.");
|
||||
} else {
|
||||
float x, y, z;
|
||||
if (!Convert_TryParseFloat(&args[1], &x) || !Convert_TryParseFloat(&args[2], &y) || !Convert_TryParseFloat(&args[3], &z)) {
|
||||
Chat_AddRaw("&e/client teleport: &cCoordinates must be decimals");
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3 v = { x, y, z };
|
||||
struct LocationUpdate update; LocationUpdate_MakePos(&update, v, false);
|
||||
struct Entity* entity = &LocalPlayer_Instance.Base;
|
||||
entity->VTABLE->SetLocation(entity, &update, false);
|
||||
return;
|
||||
}
|
||||
if (!Convert_TryParseFloat(&args[1], &v.X) || !Convert_TryParseFloat(&args[2], &v.Y) || !Convert_TryParseFloat(&args[3], &v.Z)) {
|
||||
Chat_AddRaw("&e/client teleport: &cCoordinates must be decimals");
|
||||
return;
|
||||
}
|
||||
|
||||
struct LocationUpdate update; LocationUpdate_MakePos(&update, v, false);
|
||||
struct Entity* entity = &LocalPlayer_Instance.Base;
|
||||
entity->VTABLE->SetLocation(entity, &update, false);
|
||||
}
|
||||
|
||||
struct ChatCommand TeleportCommand_Instance = {
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
struct IGameComponent;
|
||||
|
||||
enum MSG_TYPE {
|
||||
typedef enum MsgType {
|
||||
MSG_TYPE_NORMAL = 0,
|
||||
MSG_TYPE_STATUS_1 = 1,
|
||||
MSG_TYPE_STATUS_2 = 2,
|
||||
@ -19,8 +19,8 @@ enum MSG_TYPE {
|
||||
MSG_TYPE_ANNOUNCEMENT = 100,
|
||||
MSG_TYPE_CLIENTSTATUS_1 = 256, /* Cuboid messages */
|
||||
MSG_TYPE_CLIENTSTATUS_2 = 257, /* Clipboard invalid character */
|
||||
MSG_TYPE_CLIENTSTATUS_3 = 258, /* Tab list matching names*/
|
||||
};
|
||||
MSG_TYPE_CLIENTSTATUS_3 = 258 /* Tab list matching names*/
|
||||
} MsgType;
|
||||
|
||||
struct ChatLine { char Buffer[STRING_SIZE]; TimeMS Received; };
|
||||
struct ChatLine Chat_Status[3], Chat_BottomRight[3], Chat_ClientStatus[3], Chat_Announcement;
|
||||
@ -31,7 +31,7 @@ void Chat_MakeComponent(struct IGameComponent* comp);
|
||||
void Chat_SetLogName(const String* name);
|
||||
void Chat_Send(const String* text, bool logUsage);
|
||||
void Chat_Add(const String* text);
|
||||
void Chat_AddOf(const String* text, int messageType);
|
||||
void Chat_AddOf(const String* text, MsgType type);
|
||||
void Chat_AddRaw(const char* raw);
|
||||
|
||||
NOINLINE_ void Chat_LogError(ReturnCode result, const char* place);
|
||||
|
50
src/Model.c
50
src/Model.c
@ -10,9 +10,9 @@
|
||||
#define UV_POS_MASK ((uint16_t)0x7FFF)
|
||||
#define UV_MAX ((uint16_t)0x8000)
|
||||
#define UV_MAX_SHIFT 15
|
||||
#define AABB_Width(bb) (bb->Max.X - bb->Min.X)
|
||||
#define AABB_Height(bb) (bb->Max.Y - bb->Min.Y)
|
||||
#define AABB_Length(bb) (bb->Max.Z - bb->Min.Z)
|
||||
#define AABB_Width(bb) ((bb)->Max.X - (bb)->Min.X)
|
||||
#define AABB_Height(bb) ((bb)->Max.Y - (bb)->Min.Y)
|
||||
#define AABB_Length(bb) ((bb)->Max.Z - (bb)->Min.Z)
|
||||
|
||||
void ModelVertex_Init(struct ModelVertex* vertex, float x, float y, float z, int u, int v) {
|
||||
vertex->X = x; vertex->Y = y; vertex->Z = z;
|
||||
@ -49,9 +49,9 @@ void Model_Init(struct Model* model) {
|
||||
model->NameScale = 1.0f;
|
||||
model->armX = 6; model->armY = 12;
|
||||
|
||||
model->GetTransform = Model_GetTransform;
|
||||
model->GetTransform = Model_GetTransform;
|
||||
model->RecalcProperties = Model_NullFunc;
|
||||
model->DrawArm = Model_NullFunc;
|
||||
model->DrawArm = Model_NullFunc;
|
||||
}
|
||||
|
||||
bool Model_ShouldRender(struct Entity* entity) {
|
||||
@ -156,9 +156,9 @@ void Model_ApplyTexture(struct Entity* entity) {
|
||||
}
|
||||
|
||||
void Model_DrawPart(struct ModelPart* part) {
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct ModelVertex* src = &model->vertices[part->Offset];
|
||||
VertexP3fT2fC4b* dst = &ModelCache_Vertices[model->index];
|
||||
VertexP3fT2fC4b* dst = &ModelCache_Vertices[model->index];
|
||||
int i, count = part->Count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@ -178,14 +178,15 @@ void Model_DrawPart(struct ModelPart* part) {
|
||||
#define Model_RotateZ t = cosZ * v.X + sinZ * v.Y; v.Y = -sinZ * v.X + cosZ * v.Y; v.X = t;
|
||||
|
||||
void Model_DrawRotate(float angleX, float angleY, float angleZ, struct ModelPart* part, bool head) {
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct ModelVertex* src = &model->vertices[part->Offset];
|
||||
VertexP3fT2fC4b* dst = &ModelCache_Vertices[model->index];
|
||||
|
||||
float cosX = Math_CosF(-angleX), sinX = Math_SinF(-angleX);
|
||||
float cosY = Math_CosF(-angleY), sinY = Math_SinF(-angleY);
|
||||
float cosZ = Math_CosF(-angleZ), sinZ = Math_SinF(-angleZ);
|
||||
float x = part->RotX, y = part->RotY, z = part->RotZ;
|
||||
|
||||
struct ModelVertex* src = &model->vertices[part->Offset];
|
||||
VertexP3fT2fC4b* dst = &ModelCache_Vertices[model->index];
|
||||
|
||||
int i, count = part->Count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@ -232,9 +233,9 @@ void Model_RenderArm(struct Model* model, struct Entity* entity) {
|
||||
struct Matrix translate;
|
||||
|
||||
if (Game_ClassicArmModel) {
|
||||
// TODO: Position's not quite right.
|
||||
// Matrix4.Translate(out m, -armX / 16f + 0.2f, -armY / 16f - 0.20f, 0);
|
||||
// is better, but that breaks the dig animation
|
||||
/* TODO: Position's not quite right. */
|
||||
/* Matrix_Translate(out m, -armX / 16f + 0.2f, -armY / 16f - 0.20f, 0); */
|
||||
/* is better, but that breaks the dig animation */
|
||||
Matrix_Translate(&translate, -model->armX / 16.0f, -model->armY / 16.0f - 0.10f, 0);
|
||||
} else {
|
||||
Matrix_Translate(&translate, -model->armX / 16.0f + 0.10f, -model->armY / 16.0f - 0.26f, 0);
|
||||
@ -253,7 +254,7 @@ void Model_RenderArm(struct Model* model, struct Entity* entity) {
|
||||
}
|
||||
|
||||
void Model_DrawArmPart(struct ModelPart* part) {
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct Model* model = Model_ActiveModel;
|
||||
struct ModelPart arm = *part;
|
||||
arm.RotX = model->armX / 16.0f;
|
||||
arm.RotY = (model->armY + model->armY / 2) / 16.0f;
|
||||
@ -285,7 +286,7 @@ void BoxDesc_MirrorX(struct BoxDesc* desc) {
|
||||
}
|
||||
|
||||
|
||||
void BoxDesc_BuildBox(struct ModelPart* part, struct BoxDesc* desc) {
|
||||
void BoxDesc_BuildBox(struct ModelPart* part, const struct BoxDesc* desc) {
|
||||
int sidesW = desc->SizeZ, bodyW = desc->SizeX, bodyH = desc->SizeY;
|
||||
float x1 = desc->X1, y1 = desc->Y1, z1 = desc->Z1;
|
||||
float x2 = desc->X2, y2 = desc->Y2, z2 = desc->Z2;
|
||||
@ -303,11 +304,11 @@ void BoxDesc_BuildBox(struct ModelPart* part, struct BoxDesc* desc) {
|
||||
desc->RotX, desc->RotY, desc->RotZ);
|
||||
}
|
||||
|
||||
void BoxDesc_BuildRotatedBox(struct ModelPart* part, struct BoxDesc* desc) {
|
||||
void BoxDesc_BuildRotatedBox(struct ModelPart* part, const struct BoxDesc* desc) {
|
||||
int sidesW = desc->SizeY, bodyW = desc->SizeX, bodyH = desc->SizeZ;
|
||||
float x1 = desc->X1, y1 = desc->Y1, z1 = desc->Z1;
|
||||
float x2 = desc->X2, y2 = desc->Y2, z2 = desc->Z2;
|
||||
int x = desc->TexX, y = desc->TexY;
|
||||
int x = desc->TexX, y = desc->TexY, i;
|
||||
struct Model* m = Model_ActiveModel;
|
||||
|
||||
BoxDesc_YQuad(m, x + sidesW + bodyW + sidesW, y + sidesW, bodyW, bodyH, x1, x2, z1, z2, y2, false); /* top */
|
||||
@ -318,7 +319,6 @@ void BoxDesc_BuildRotatedBox(struct ModelPart* part, struct BoxDesc* desc) {
|
||||
BoxDesc_XQuad(m, x + sidesW + bodyW, y + sidesW, sidesW, bodyH, y1, y2, z2, z1, x1, false); /* right */
|
||||
|
||||
/* rotate left and right 90 degrees */
|
||||
int i;
|
||||
for (i = m->index - 8; i < m->index; i++) {
|
||||
struct ModelVertex vertex = m->vertices[i];
|
||||
float z = vertex.Z; vertex.Z = vertex.Y; vertex.Y = z;
|
||||
@ -331,8 +331,8 @@ void BoxDesc_BuildRotatedBox(struct ModelPart* part, struct BoxDesc* desc) {
|
||||
|
||||
|
||||
void BoxDesc_XQuad(struct Model* m, int texX, int texY, int texWidth, int texHeight, float z1, float z2, float y1, float y2, float x, bool swapU) {
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX;
|
||||
if (swapU) { int tmp = u1; u1 = u2; u2 = tmp; }
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX, tmp;
|
||||
if (swapU) { tmp = u1; u1 = u2; u2 = tmp; }
|
||||
|
||||
ModelVertex_Init(&m->vertices[m->index], x, y1, z1, u1, (texY + texHeight) | UV_MAX); m->index++;
|
||||
ModelVertex_Init(&m->vertices[m->index], x, y2, z1, u1, texY); m->index++;
|
||||
@ -341,8 +341,8 @@ void BoxDesc_XQuad(struct Model* m, int texX, int texY, int texWidth, int texHei
|
||||
}
|
||||
|
||||
void BoxDesc_YQuad(struct Model* m, int texX, int texY, int texWidth, int texHeight, float x1, float x2, float z1, float z2, float y, bool swapU) {
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX;
|
||||
if (swapU) { int tmp = u1; u1 = u2; u2 = tmp; }
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX, tmp;
|
||||
if (swapU) { tmp = u1; u1 = u2; u2 = tmp; }
|
||||
|
||||
ModelVertex_Init(&m->vertices[m->index], x1, y, z2, u1, (texY + texHeight) | UV_MAX); m->index++;
|
||||
ModelVertex_Init(&m->vertices[m->index], x1, y, z1, u1, texY); m->index++;
|
||||
@ -351,8 +351,8 @@ void BoxDesc_YQuad(struct Model* m, int texX, int texY, int texWidth, int texHei
|
||||
}
|
||||
|
||||
void BoxDesc_ZQuad(struct Model* m, int texX, int texY, int texWidth, int texHeight, float x1, float x2, float y1, float y2, float z, bool swapU) {
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX;
|
||||
if (swapU) { int tmp = u1; u1 = u2; u2 = tmp; }
|
||||
int u1 = texX, u2 = (texX + texWidth) | UV_MAX, tmp;
|
||||
if (swapU) { tmp = u1; u1 = u2; u2 = tmp; }
|
||||
|
||||
ModelVertex_Init(&m->vertices[m->index], x1, y1, z, u1, (texY + texHeight) | UV_MAX); m->index++;
|
||||
ModelVertex_Init(&m->vertices[m->index], x1, y2, z, u1, texY); m->index++;
|
||||
|
@ -109,7 +109,7 @@ let SW = sides width, BW = body width, BH = body height
|
||||
|H--------tex---------H|H--------tex---------H|H--------tex---------H|H--------tex---------H|
|
||||
|----------SW----------|----------BW----------|----------SW----------|----------BW----------|
|
||||
********************************************************************************************* */
|
||||
void BoxDesc_BuildBox(struct ModelPart* part, struct BoxDesc* desc);
|
||||
void BoxDesc_BuildBox(struct ModelPart* part, const struct BoxDesc* desc);
|
||||
|
||||
/* Builds a box model assuming the follow texture layout:
|
||||
let SW = sides width, BW = body width, BH = body height
|
||||
@ -124,7 +124,7 @@ let SW = sides width, BW = body width, BH = body height
|
||||
|H--------tex---------H|H--------tex---------H|H--------tex---------H|H--------tex---------H|
|
||||
|----------SW----------|----------BW----------|----------BW----------|----------------------|
|
||||
********************************************************************************************* */
|
||||
void BoxDesc_BuildRotatedBox(struct ModelPart* part, struct BoxDesc* desc);
|
||||
void BoxDesc_BuildRotatedBox(struct ModelPart* part, const struct BoxDesc* desc);
|
||||
|
||||
void BoxDesc_XQuad(struct Model* m, int texX, int texY, int texWidth, int texHeight, float z1, float z2, float y1, float y2, float x, bool swapU);
|
||||
void BoxDesc_YQuad(struct Model* m, int texX, int texY, int texWidth, int texHeight, float x1, float x2, float z1, float z2, float y, bool swapU);
|
||||
|
@ -20,9 +20,6 @@ Vector3 Vector3_BigPos(void);
|
||||
float Vector3_LengthSquared(const Vector3* v);
|
||||
|
||||
#define VECTOR3_CONST(x, y, z) { x, y, z };
|
||||
#define Vector3_UnitX VECTOR3_CONST(1.0f, 0.0f, 0.0f)
|
||||
#define Vector3_UnitY VECTOR3_CONST(0.0f, 1.0f, 0.0f)
|
||||
#define Vector3_UnitZ VECTOR3_CONST(0.0f, 0.0f, 1.0f)
|
||||
#define Vector3_Zero VECTOR3_CONST(0.0f, 0.0f, 0.0f)
|
||||
#define Vector3_One VECTOR3_CONST(1.0f, 1.0f, 1.0f)
|
||||
|
||||
|
@ -42,12 +42,11 @@ BlockID World_SafeGetBlock_3I(Vector3I p);
|
||||
bool World_IsValidPos(int x, int y, int z);
|
||||
bool World_IsValidPos_3I(Vector3I p);
|
||||
|
||||
enum ENV_VAR {
|
||||
enum EnvVar_ {
|
||||
ENV_VAR_EDGE_BLOCK, ENV_VAR_SIDES_BLOCK, ENV_VAR_EDGE_HEIGHT, ENV_VAR_SIDES_OFFSET,
|
||||
ENV_VAR_CLOUDS_HEIGHT, ENV_VAR_CLOUDS_SPEED, ENV_VAR_WEATHER_SPEED, ENV_VAR_WEATHER_FADE,
|
||||
ENV_VAR_WEATHER, ENV_VAR_EXP_FOG, ENV_VAR_SKYBOX_HOR_SPEED, ENV_VAR_SKYBOX_VER_SPEED,
|
||||
ENV_VAR_SKY_COL, ENV_VAR_CLOUDS_COL, ENV_VAR_FOG_COL, ENV_VAR_SUN_COL,
|
||||
ENV_VAR_SHADOW_COL,
|
||||
ENV_VAR_SKY_COL, ENV_VAR_CLOUDS_COL, ENV_VAR_FOG_COL, ENV_VAR_SUN_COL, ENV_VAR_SHADOW_COL
|
||||
};
|
||||
|
||||
BlockID Env_EdgeBlock, Env_SidesBlock;
|
||||
@ -57,7 +56,7 @@ int Env_SidesOffset;
|
||||
int Env_CloudsHeight;
|
||||
float Env_CloudsSpeed;
|
||||
|
||||
enum WEATHER { WEATHER_SUNNY, WEATHER_RAINY, WEATHER_SNOWY };
|
||||
enum Weather_ { WEATHER_SUNNY, WEATHER_RAINY, WEATHER_SNOWY };
|
||||
extern const char* Weather_Names[3];
|
||||
float Env_WeatherSpeed;
|
||||
float Env_WeatherFade;
|
||||
|
Loading…
x
Reference in New Issue
Block a user