Add /client blockedit command that allows changing some properties of blocks

This commit is contained in:
UnknownShadow200 2023-06-11 23:22:40 +10:00
parent 33217d464d
commit d453eb3d97
3 changed files with 98 additions and 16 deletions

View File

@ -646,6 +646,84 @@ static struct ChatCommand TeleportCommand = {
};
/*########################################################################################################################*
*------------------------------------------------------BlockEditCommand----------------------------------------------------*
*#########################################################################################################################*/
static cc_bool BlockEditCommand_GetTexture(const cc_string* value, int* tex) {
int maxTexs = ATLAS1D_MAX_ATLASES;
if (!Convert_ParseInt(value, tex)) {
Chat_AddRaw("&eBlockEdit: &eTexture must be an integer");
return false;
}
if (*tex < 0 || *tex >= maxTexs) {
Chat_Add1("&eBlockEdit: &eTexture must be between 0 and %i", &maxTexs);
return false;
}
return true;
}
static void BlockEditCommand_Execute(const cc_string* args, int argsCount__) {
cc_string parts[3];
cc_string* prop;
cc_string* value;
int argsCount, block, tex;
if (String_CaselessEqualsConst(args, "properties")) {
Chat_AddRaw("&eEditable block properties:");
Chat_AddRaw("&a name &e- Sets the name of the block");
Chat_AddRaw("&a all &e- Sets textures on all six sides of the block");
Chat_AddRaw("&a sides &e- Sets textures on four sides of the block");
return;
}
argsCount = String_UNSAFE_Split(args, ' ', parts, 3);
if (argsCount < 3) {
Chat_AddRaw("&eBlockEdit: &eThree arguments required &e(See &a/client help blockedit&e)");
return;
}
block = Block_Parse(&parts[0]);
if (block == -1) {
Chat_Add1("&eBlockEdit: &c\"%s\" is not a valid block name or ID", &parts[0]);
return;
}
prop = &parts[1];
value = &parts[2];
if (String_CaselessEqualsConst(prop, "name")) {
Block_SetName(block, value);
} else if (String_CaselessEqualsConst(prop, "all")) {
if (!BlockEditCommand_GetTexture(value, &tex)) return;
Block_SetSide(tex, block);
Block_Tex(block, FACE_YMAX) = tex;
Block_Tex(block, FACE_YMIN) = tex;
} else if (String_CaselessEqualsConst(prop, "sides")) {
if (!BlockEditCommand_GetTexture(value, &tex)) return;
Block_SetSide(tex, block);
} else {
Chat_Add1("&eBlockEdit: &eUnknown property %s &e(See &a/client help blockedit&e)", prop);
return;
}
Block_DefineCustom(block, false);
}
static struct ChatCommand BlockEditCommand = {
"BlockEdit", BlockEditCommand_Execute,
COMMAND_FLAG_SINGLEPLAYER_ONLY | COMMAND_FLAG_UNSPLIT_ARGS,
{
"&a/client blockedit [block] [property] [value]",
"&eEdits the given property of the given block",
"&a/client blockedit properties",
"&eLists the editable block properties",
}
};
/*########################################################################################################################*
*-------------------------------------------------------Generic chat------------------------------------------------------*
*#########################################################################################################################*/
@ -681,6 +759,7 @@ static void OnInit(void) {
Commands_Register(&CuboidCommand);
Commands_Register(&TeleportCommand);
Commands_Register(&ClearDeniedCommand);
Commands_Register(&BlockEditCommand);
#if defined CC_BUILD_MOBILE || defined CC_BUILD_WEB
/* Better to not log chat by default on mobile/web, */

View File

@ -15,26 +15,19 @@ static int* iso_state_base;
static cc_bool iso_cacheInited;
static PackedCol iso_colorXSide, iso_colorZSide, iso_colorYBottom;
static float iso_posX, iso_posY;
#define iso_cosX (0.86602540378443864f) /* cos(30 * MATH_DEG2RAD) */
#define iso_sinX (0.50000000000000000f) /* sin(30 * MATH_DEG2RAD) */
#define iso_cosY (0.70710678118654752f) /* cos(-45 * MATH_DEG2RAD) */
#define iso_sinY (-0.70710678118654752f) /* sin(-45 * MATH_DEG2RAD) */
static struct Matrix iso_transform;
static float iso_posX, iso_posY;
static void IsometricDrawer_InitCache(void) {
struct Matrix rotY, rotX;
if (iso_cacheInited) return;
iso_cacheInited = true;
PackedCol_GetShaded(PACKEDCOL_WHITE,
&iso_colorXSide, &iso_colorZSide, &iso_colorYBottom);
Matrix_RotateY(&rotY, 45.0f * MATH_DEG2RAD);
Matrix_RotateX(&rotX, -30.0f * MATH_DEG2RAD);
Matrix_Mul(&iso_transform, &rotY, &rotX);
}
static TextureLoc IsometricDrawer_GetTexLoc(BlockID block, Face face) {
@ -76,6 +69,7 @@ static void IsometricDrawer_Angled(BlockID block, float size) {
cc_bool bright;
Vec3 min, max;
struct VertexTextured* beg = iso_vertices;
struct VertexTextured* v;
float x, y, scale;
/* isometric coords size: cosY * -scale - sinY * scale */
@ -104,12 +98,18 @@ static void IsometricDrawer_Angled(BlockID block, float size) {
Drawer_YMax(1, PACKEDCOL_WHITE,
IsometricDrawer_GetTexLoc(block, FACE_YMAX), &iso_vertices);
for (struct VertexTextured* v = beg; v < iso_vertices; v++)
for (v = beg; v < iso_vertices; v++)
{
/* Cut down Vec3_Transform (row4 is always 0, and don't need Z) */
struct Matrix* mat = &iso_transform;
x = v->X * mat->row1.X + v->Y * mat->row2.X + v->Z * mat->row3.X;
y = v->X * mat->row1.Y + v->Y * mat->row2.Y + v->Z * mat->row3.Y;
/* Cut down form of: */
/* Matrix_RotateY(&rotY, 45.0f * MATH_DEG2RAD); */
/* Matrix_RotateX(&rotX, -30.0f * MATH_DEG2RAD); */
/* Matrix_Mul(&iso_transform, &rotY, &rotX); */
/* ... */
/* Vec3 vec = { v.X, v.Y, v.Z }; */
/* Vec3_Transform(&vec, &vec, &iso_transform); */
/* With all unnecessary operations either simplified or removed */
x = v->X * iso_cosY + v->Z * -iso_sinY;
y = v->X * iso_sinX * iso_sinY + v->Y * iso_cosX + v->Z * iso_sinX * iso_cosY;
v->X = x + iso_posX;
v->Y = y + iso_posY;
@ -173,5 +173,4 @@ void IsometricDrawer_EndBatch(GfxResourceID vb) {
if (iso_state != iso_state_base) {
IsometricDrawer_Render(vb);
}
Gfx_LoadIdentityMatrix(MATRIX_VIEW);
}

View File

@ -1518,9 +1518,13 @@ static void InventoryScreen_Init(void* screen) {
Event_Register_(&BlockEvents.BlockDefChanged, s, InventoryScreen_OnBlockChanged);
}
static void InventoryScreen_Render(void* screen, double delta) {
static void InventoryScreen_Update(void* screen, double delta) {
struct InventoryScreen* s = (struct InventoryScreen*)screen;
if (s->deferredSelect) InventoryScreen_MoveToSelected(s);
}
static void InventoryScreen_Render(void* screen, double delta) {
struct InventoryScreen* s = (struct InventoryScreen*)screen;
Elem_Render(&s->table, delta);
Elem_Render(&s->title, delta);
}
@ -1604,7 +1608,7 @@ static int InventoryScreen_MouseScroll(void* screen, float delta) {
}
static const struct ScreenVTABLE InventoryScreen_VTABLE = {
InventoryScreen_Init, Screen_NullUpdate, InventoryScreen_Free,
InventoryScreen_Init, InventoryScreen_Update, InventoryScreen_Free,
InventoryScreen_Render, InventoryScreen_BuildMesh,
InventoryScreen_KeyDown, InventoryScreen_KeyUp, Screen_TKeyPress, Screen_TText,
InventoryScreen_PointerDown, InventoryScreen_PointerUp, InventoryScreen_PointerMove, InventoryScreen_MouseScroll,