// Decodes a value from the reader and pushes it onto the stack func LuaDecodeValue(r io.Reader, L *lua.State, g *Game) error { var le luaEncodable err := binary.Read(r, binary.LittleEndian, &le) if err != nil { return err } switch le { case luaEncBool: var v byte err = binary.Read(r, binary.LittleEndian, &v) L.PushBoolean(v == 1) case luaEncNumber: var f float64 err = binary.Read(r, binary.LittleEndian, &f) L.PushNumber(f) case luaEncNil: L.PushNil() case luaEncEntity: var id uint64 err = binary.Read(r, binary.LittleEndian, &id) ent := g.EntityById(EntityId(id)) LuaPushEntity(L, ent) if ent != nil { base.Log().Printf("LUA: Push Ent %s", ent.Name) } else { base.Log().Printf("LUA: Push Ent NIL") } case luaEncTable: err = LuaDecodeTable(r, L, g) case luaEncString: var length uint32 err = binary.Read(r, binary.LittleEndian, &length) if err != nil { return err } sb := make([]byte, length) err = binary.Read(r, binary.LittleEndian, &sb) L.PushString(string(sb)) default: return errors.New(fmt.Sprintf("Unknown lua value id == %d.", le)) } if err != nil { return err } return nil }