Make chat history edits saved temporarily
This commit is contained in:
parent
5e5088e3ef
commit
8de638eb1a
@ -3,4 +3,6 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
extern "C" {
|
||||
void title_screen_load_splashes(std::vector<std::string> &splashes);
|
||||
}
|
||||
|
@ -60,9 +60,9 @@ void chat_handle_packet_send(Minecraft *minecraft, ChatPacket *packet) {
|
||||
RakNetInstance *rak_net_instance = minecraft->rak_net_instance;
|
||||
if (rak_net_instance->vtable->isServer(rak_net_instance)) {
|
||||
// Hosting Multiplayer
|
||||
char *message = packet->message;
|
||||
const char *message = packet->message.c_str();
|
||||
ServerSideNetworkHandler *server_side_network_handler = (ServerSideNetworkHandler *) minecraft->network_handler;
|
||||
chat_send_message(server_side_network_handler, Strings_default_username, message);
|
||||
chat_send_message(server_side_network_handler, Strings_default_username, (char *) message);
|
||||
} else {
|
||||
// Client
|
||||
rak_net_instance->vtable->send(rak_net_instance, (Packet *) packet);
|
||||
@ -82,8 +82,8 @@ static void ServerSideNetworkHandler_handle_ChatPacket_injection(ServerSideNetwo
|
||||
Player *player = ServerSideNetworkHandler_getPlayer(server_side_network_handler, rak_net_guid);
|
||||
if (player != NULL) {
|
||||
const char *username = player->username.c_str();
|
||||
char *message = chat_packet->message;
|
||||
chat_send_message(server_side_network_handler, (char *) username, message);
|
||||
const char *message = chat_packet->message.c_str();
|
||||
chat_send_message(server_side_network_handler, (char *) username, (char *) message);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,10 +15,6 @@ static std::vector<std::string> &get_history() {
|
||||
return history;
|
||||
}
|
||||
|
||||
static std::string index_vec(const std::vector<std::string> &vec, int pos) {
|
||||
return pos == int(vec.size()) ? "" : vec.at(pos);
|
||||
}
|
||||
|
||||
// Structure
|
||||
struct ChatScreen {
|
||||
TextInputScreen super;
|
||||
@ -29,6 +25,7 @@ struct ChatScreen {
|
||||
CUSTOM_VTABLE(chat_screen, Screen) {
|
||||
TextInputScreen::setup(vtable);
|
||||
// Init
|
||||
static std::vector<std::string> local_history = {};
|
||||
static Screen_init_t original_init = vtable->init;
|
||||
vtable->init = [](Screen *super) {
|
||||
original_init(super);
|
||||
@ -39,6 +36,8 @@ CUSTOM_VTABLE(chat_screen, Screen) {
|
||||
self->chat->init(super->font);
|
||||
self->chat->setFocused(true);
|
||||
self->history_pos = get_history().size();
|
||||
local_history = get_history();
|
||||
local_history.push_back("");
|
||||
// Determine Max Length
|
||||
std::string prefix = _chat_get_prefix(Strings_default_username);
|
||||
int max_length = MAX_CHAT_MESSAGE_LENGTH - prefix.length();
|
||||
@ -87,34 +86,39 @@ CUSTOM_VTABLE(chat_screen, Screen) {
|
||||
vtable->keyPressed = [](Screen *super, int key) {
|
||||
// Handle Enter
|
||||
ChatScreen *self = (ChatScreen *) super;
|
||||
if (key == 0x0d && self->chat->isFocused()) {
|
||||
if (self->chat->getText().length() > 0) {
|
||||
std::string text = self->chat->getText();
|
||||
std::vector<std::string> &history = get_history();
|
||||
if (history.size() == 0 || text != history.back()) {
|
||||
history.push_back(text);
|
||||
if (self->chat->isFocused()) {
|
||||
if (key == 0x0d) {
|
||||
if (self->chat->getText().length() > 0) {
|
||||
std::string text = self->chat->getText();
|
||||
if (get_history().size() == 0 || text != get_history().back()) {
|
||||
get_history().push_back(text);
|
||||
}
|
||||
_chat_queue_message(text.c_str());
|
||||
}
|
||||
_chat_queue_message(text.c_str());
|
||||
Minecraft_setScreen(super->minecraft, NULL);
|
||||
} else if (key == 0x26) {
|
||||
// Up
|
||||
local_history.at(self->history_pos) = self->chat->getText();
|
||||
// Change
|
||||
int old_pos = self->history_pos;
|
||||
self->history_pos -= 1;
|
||||
if (self->history_pos < 0) self->history_pos = local_history.size() - 1;
|
||||
if (old_pos != self->history_pos) {
|
||||
self->chat->setText(local_history.at(self->history_pos));
|
||||
}
|
||||
return;
|
||||
} else if (key == 0x28) {
|
||||
// Down
|
||||
local_history.at(self->history_pos) = self->chat->getText();
|
||||
// Change
|
||||
int old_pos = self->history_pos;
|
||||
self->history_pos += 1;
|
||||
if (self->history_pos > int(local_history.size()) - 1) self->history_pos = 0;
|
||||
if (old_pos != self->history_pos) {
|
||||
self->chat->setText(local_history.at(self->history_pos));
|
||||
}
|
||||
return;
|
||||
}
|
||||
Minecraft_setScreen(super->minecraft, NULL);
|
||||
} else if (key == 0x26 && self->chat->isFocused()) {
|
||||
// Up
|
||||
int old_pos = self->history_pos;
|
||||
self->history_pos -= 1;
|
||||
if (self->history_pos < 0) self->history_pos = get_history().size();
|
||||
if (old_pos != self->history_pos) {
|
||||
self->chat->setText(index_vec(get_history(), self->history_pos));
|
||||
}
|
||||
return;
|
||||
} else if (key == 0x28 && self->chat->isFocused()) {
|
||||
// Down
|
||||
int old_pos = self->history_pos;
|
||||
self->history_pos += 1;
|
||||
if (self->history_pos > int(get_history().size())) self->history_pos = 0;
|
||||
if (old_pos != self->history_pos) {
|
||||
self->chat->setText(index_vec(get_history(), self->history_pos));
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Call Original Method
|
||||
original_keyPressed(super, key);
|
||||
|
@ -37,5 +37,6 @@ property float height_offset = 0x68;
|
||||
property int fire_timer = 0xa0;
|
||||
property int renderer_id = 0xa8;
|
||||
property bool on_ground = 0xb2;
|
||||
property bool pending_removal = 0xb8;
|
||||
property bool freeze_physics = 0xb9;
|
||||
property float fall_distance = 0xac;
|
||||
|
@ -3,3 +3,5 @@ constructor () = 0x6096c;
|
||||
method void assign(uchar entity_id, EntityRenderer *renderer) = 0x6094c;
|
||||
method void render(Entity *entity, float x, float y, float z, float rot, float unknown) = 0x60674;
|
||||
static-method EntityRenderDispatcher *getInstance() = 0x60e90;
|
||||
|
||||
property ItemInHandRenderer *item_renderer = 0x0;
|
||||
|
@ -4,6 +4,4 @@ property ItemInstance item = 0xc;
|
||||
property Minecraft *mc = 0x18;
|
||||
|
||||
method void renderItem(Mob *mob, ItemInstance *item) = 0x4b824;
|
||||
method void render(float param_1) = 0x4bfcc;
|
||||
|
||||
static-property ItemInHandRenderer **instance = 0x137bc0;
|
||||
method void render(float param_1) = 0x4bfcc;
|
@ -3,13 +3,20 @@ extends LevelSource;
|
||||
vtable 0x10fcf0;
|
||||
|
||||
method void saveLevelData() = 0xa2e94;
|
||||
method void setTile(int x, int y, int z, int id) = 0xa3904;
|
||||
method void setTileAndData(int x, int y, int z, int id, int data) = 0xa38b4;
|
||||
method void setTileAndDataNoUpdate(int x, int y, int z, int id, int data) = 0xa33d0;
|
||||
method HitResult clip(uchar *param_1, uchar *param_2, bool clip_liquids, bool param_3) = 0xa3db0;
|
||||
// clip_liquids and clip_hitboxes default to true
|
||||
// If clip_hitboxes is true it will ignore blocks that have their getAABB return NULL
|
||||
method HitResult clip(uchar *param_1, uchar *param_2, bool clip_liquids, bool clip_hitboxes) = 0xa3db0;
|
||||
// Valid particles are crit, flame, lava, smoke, largesmoke, reddust, snowballpoof, and explode
|
||||
// There is also bubble which only works under water and ironcrack which will crash the game
|
||||
method void addParticle(std::string *particle, float x, float y, float z, float deltaX, float deltaY, float deltaZ, int count) = 0xa449c;
|
||||
method Entity *getEntity(int id) = 0xa45a4;
|
||||
method bool addEntity(Entity *entity) = 0xa7cbc;
|
||||
method int getBrightness2(LightLayer *layer, int x, int y, int z) = 0xa3c70;
|
||||
method int getRawBrightness(int x, int y, int z) = 0xa3b70;
|
||||
// See mods/src/sound/repository.cpp for a list of sounds
|
||||
method void playSound(Entity *entity, std::string *name, float volume, float pitch) = 0xa42a8;
|
||||
// Searches aabb for entities, ignores the entity "ignore", overwrites the same vector each time
|
||||
method std::vector<Entity*> *getEntities(Entity *ignore, AABB *aabb) = 0xa5a4c;
|
||||
@ -19,7 +26,16 @@ method int getEntitiesOfType(int type_id, AABB *aabb, std::vector<Entity*> *buff
|
||||
method int getEntitiesOfClass(int base_type, AABB *aabb, std::vector<Entity*> *buff) = 0xa6240;
|
||||
// This will implicitly make the tile entity if the tile at x, y, z doesn't have one and is an EntityTile
|
||||
method TileEntity *getTileEntity(int x, int y, int z) = 0xa55d4;
|
||||
method void removeTileEntity(int x, int y, int z) = 0xa7aac;
|
||||
method void animateTick(int x, int y, int z) = 0xa5920;
|
||||
// Called by trapdoors, doors, and tnt
|
||||
method bool hasNeighborSignal(int x, int y, int z) = 0xa5f08;
|
||||
// Called by hasNeighborSignal
|
||||
method bool getSignal(int x, int y, int z, int direction) = 0xa5e6c;
|
||||
// Called by getSignal
|
||||
method bool hasDirectSignal(int x, int y, int z) = 0xa5d88;
|
||||
// Called by hasDirectSignal
|
||||
method bool getDirectSignal(int x, int y, int z, int direction) = 0xa5d2c;
|
||||
|
||||
virtual-method void tick() = 0x28;
|
||||
virtual-method void updateSleepingPlayerList() = 0x2c;
|
||||
|
@ -1,7 +1,8 @@
|
||||
virtual-method bool isSolid() = 0x8;
|
||||
|
||||
// Globals
|
||||
static-property Material *dirt = 0x180a94;
|
||||
static-property Material *dirt = 0x180a94;
|
||||
static-property Material *stone = 0x180a9c;
|
||||
static-property Material *metal = 0x180aa0;
|
||||
static-property Material *plant = 0x180ab0;
|
||||
static-property Material *glass = 0x180acc;
|
||||
|
@ -1,5 +1,6 @@
|
||||
extends Level;
|
||||
|
||||
vtable 0x109da0;
|
||||
size 0xb80;
|
||||
|
||||
constructor (uchar *storage, uchar *name, LevelSettings *settings, int param_4, Dimension *dimension) = 0x7692c;
|
||||
|
@ -1,3 +1,5 @@
|
||||
|
||||
constructor () = 0xb64a0;
|
||||
vtable 0x10e530;
|
||||
vtable-size 0x10;
|
||||
|
||||
|
@ -5,6 +5,9 @@ size 0x24;
|
||||
constructor (std::string name) = 0x69740;
|
||||
|
||||
method bool getBoolean(std::string *name) = 0xd1b28;
|
||||
method char getByte(std::string *name) = 0x7f00c;
|
||||
method void putByte(std::string *name, char i) = 0x7d6d0;
|
||||
method short getShort(std::string *name) = 0x459c0;
|
||||
method void putShort(std::string *name, short i) = 0x7d60c;
|
||||
method bool contains(std::string *name, int type) = 0x7d130;
|
||||
method void put(std::string *name, Tag *tag) = 0x6a040;
|
||||
|
@ -2,4 +2,4 @@ extends Packet;
|
||||
|
||||
vtable 0x108a98;
|
||||
|
||||
property char *message = 0xc;
|
||||
property std::string message = 0xc;
|
||||
|
@ -1,5 +1,6 @@
|
||||
constructor () = 0x6fc18;
|
||||
size 0x10;
|
||||
|
||||
size 0x8;
|
||||
vtable 0x1024d8;
|
||||
vtable-size 0x14;
|
||||
|
||||
|
@ -4,4 +4,5 @@ vtable 0x111348;
|
||||
vtable-size 0x108;
|
||||
size 0x5c;
|
||||
|
||||
// Pure virtual
|
||||
virtual-method TileEntity *newTileEntity() = 0x104;
|
||||
|
@ -19,17 +19,32 @@ virtual-method int getTexture2(int face, int data) = 0x2c;
|
||||
virtual-method int getTexture3(LevelSource *level, int x, int y, int z, int face) = 0x30;
|
||||
virtual-method AABB *getAABB(Level *level, int x, int y, int z) = 0x34;
|
||||
virtual-method bool isSolidRender() = 0x40;
|
||||
virtual-method bool mayPlace(Level *level, int x, int y, int z, uchar face) = 0x4c;
|
||||
virtual-method bool mayPlace2(Level *level, int x, int y, int z) = 0x50;
|
||||
virtual-method void tick(Level *level, int x, int y, int z) = 0x58;
|
||||
virtual-method void neighborChanged(Level *level, int x, int y, int z, int neighborId) = 0x64;
|
||||
virtual-method void onPlace(Level *level, int x, int y, int z) = 0x68;
|
||||
virtual-method void onRemove(Level *level, int x, int y, int z) = 0x6c;
|
||||
// Resource is the dropped item
|
||||
virtual-method int getResource(int data, Random *random) = 0x70;
|
||||
virtual-method int getResourceCount(Random *random) = 0x74;
|
||||
// Returns 1 (default, not transparent), 2 (transparent when the texture is, like bushes), or 3 (semi-transparent, like water)
|
||||
virtual-method int getRenderLayer() = 0x94;
|
||||
virtual-method int use(Level *level, int x, int y, int z, Player *player) = 0x98;
|
||||
virtual-method void setPlacedBy(Level *level, int x, int y, int z, Mob *placer) = 0xa8;
|
||||
virtual-method void handleEntityInside(Level *level, int x, int y, int z, Entity *entity, Vec3 *speed) = 0xb4;
|
||||
// Note that this may be ignored depending on the value of getRenderShape
|
||||
virtual-method int getColor(LevelSource *level_source, int x, int y, int z) = 0xb8;
|
||||
// This doesn't mean that it *is* producing a signal, rather that it might be
|
||||
// Called by trapdoors, doors, and tnt. Never overridden (always returns false)
|
||||
virtual-method bool isSignalSource() = 0xbc;
|
||||
// Doesn't seem to be used, but it's hard to tell with virtual methods
|
||||
// Yes, this IS a bool and not a char.
|
||||
virtual-method bool getSignal(LevelSource *level, int x, int y, int z) = 0xc0;
|
||||
// Called at the end of Level_getSignal
|
||||
virtual-method bool getSignal2(LevelSource *level, int x, int y, int z, int direction) = 0xc4;
|
||||
// Called by Level_hasDirectSignal
|
||||
virtual-method bool getDirectSignal(Level *level, int x, int y, int z, int direction) = 0xc8;
|
||||
virtual-method void entityInside(Level *level, int x, int y, int z, Entity *entity) = 0xcc;
|
||||
virtual-method std::string getDescriptionId() = 0xdc;
|
||||
virtual-method Tile *setDescriptionId(std::string *description_id) = 0xe0;
|
||||
@ -46,6 +61,8 @@ property float z1 = 0x14;
|
||||
property float x2 = 0x18;
|
||||
property float y2 = 0x1c;
|
||||
property float z2 = 0x20;
|
||||
property float destroyTime = 0x34;
|
||||
property float explodeable = 0x38;
|
||||
property int category = 0x3c;
|
||||
property AABB aabb = 0x40;
|
||||
|
||||
@ -55,6 +72,8 @@ static-property-array float lightEmission = 0x181214;
|
||||
static-property-array bool isEntityTile = 0x181f20;
|
||||
|
||||
// Tiles
|
||||
static-property Tile *grass = 0x181b14;
|
||||
static-property Tile *leaves = 0x18120c;
|
||||
static-property Tile *chest = 0x181d60;
|
||||
static-property Tile *water = 0x181b3c;
|
||||
static-property Tile *lava = 0x181cc8;
|
||||
@ -74,11 +93,10 @@ static-property Tile *stoneSlab = 0x181b44;
|
||||
static-property Tile *fire = 0x181de0;
|
||||
|
||||
// "Carried" Tiles
|
||||
static-property Tile *leaves = 0x18120c;
|
||||
static-property Tile *leaves_carried = 0x181dd8;
|
||||
static-property Tile *grass = 0x181b14;
|
||||
static-property Tile *grass_carried = 0x181dd4;
|
||||
|
||||
// Sounds
|
||||
static-property Tile_SoundType SOUND_STONE = 0x181c80;
|
||||
static-property Tile_SoundType SOUND_WOOD = 0x181cb4;
|
||||
static-property Tile_SoundType SOUND_GRASS = 0x181c94;
|
||||
|
Loading…
Reference in New Issue
Block a user