Add useful Write functions
All checks were successful
Build & Test / nix-build (push) Successful in 1m17s
All checks were successful
Build & Test / nix-build (push) Successful in 1m17s
This commit is contained in:
parent
9f9526f5de
commit
9c6c275b3e
22
lib/data.ex
22
lib/data.ex
@ -101,6 +101,28 @@ defmodule Amethyst.Minecraft.Write do
|
|||||||
def position({x, y, z}) do
|
def position({x, y, z}) do
|
||||||
<<x::signed-big-26, z::signed-big-26, y::signed-big-12>>
|
<<x::signed-big-26, z::signed-big-26, y::signed-big-12>>
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Writes a list of elements with the given `callback` function. This does not
|
||||||
|
prefix the list with a length, remember to do that yourself if needed.
|
||||||
|
|
||||||
|
iex> Amethyst.Minecraft.Write.list([1, 2, 3, 4], &Amethyst.Minecraft.Write.byte/1)
|
||||||
|
<<1, 2, 3, 4>>
|
||||||
|
"""
|
||||||
|
def list(list, callback) do
|
||||||
|
Enum.reduce(list, "", &(&2 <> callback.(&1)))
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Shorthand function for writing a value which may not be present. If `value` is `nil`,
|
||||||
|
writes `false`, otherwise writes `true` followed by the value using `callback`.
|
||||||
|
"""
|
||||||
|
def option(value, callback) do
|
||||||
|
case value do
|
||||||
|
nil -> bool(false)
|
||||||
|
v -> bool(true) <> callback.(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defmodule Amethyst.Minecraft.Read do
|
defmodule Amethyst.Minecraft.Read do
|
||||||
|
@ -143,16 +143,12 @@ defmodule Amethyst.Server.Configuration do
|
|||||||
end
|
end
|
||||||
# Remove Resource Pack https://wiki.vg/Protocol#Remove_Resource_Pack_(configuration)
|
# Remove Resource Pack https://wiki.vg/Protocol#Remove_Resource_Pack_(configuration)
|
||||||
def serialize({:remove_resource_pack, id}) do
|
def serialize({:remove_resource_pack, id}) do
|
||||||
if id == nil do
|
Write.option(id, &Write.string/1)
|
||||||
Write.varint(0x08) <> <<0x00>>
|
|
||||||
else
|
|
||||||
Write.varint(0x08) <> <<0x01>> <> Write.string(id)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
# Add Resource Pack https://wiki.vg/Protocol#Add_Resource_Pack_(configuration)
|
# Add Resource Pack https://wiki.vg/Protocol#Add_Resource_Pack_(configuration)
|
||||||
def serialize({:add_resource_pack, id, url, hash, forced, msg}) do
|
def serialize({:add_resource_pack, id, url, hash, forced, msg}) do
|
||||||
Write.varint(0x09) <> Write.string(id) <> Write.string(url) <> Write.string(hash) <>
|
Write.varint(0x09) <> Write.string(id) <> Write.string(url) <> Write.string(hash) <>
|
||||||
if(forced, do: <<0x01>>, else: <<0x00>>) <> if(msg == nil, do: <<0x00>>, else: <<0x01>> <> Write.string(msg))
|
Write.bool(forced) <> Write.option(msg, &Write.string/1)
|
||||||
end
|
end
|
||||||
# Store Cookie https://wiki.vg/Protocol#Store_Cookie_(configuration)
|
# Store Cookie https://wiki.vg/Protocol#Store_Cookie_(configuration)
|
||||||
def serialize({:store_cookie, id, data}) do
|
def serialize({:store_cookie, id, data}) do
|
||||||
@ -164,7 +160,7 @@ defmodule Amethyst.Server.Configuration do
|
|||||||
end
|
end
|
||||||
# Feature Flags https://wiki.vg/Protocol#Feature_Flags
|
# Feature Flags https://wiki.vg/Protocol#Feature_Flags
|
||||||
def serialize({:feature_flags, flags}) do
|
def serialize({:feature_flags, flags}) do
|
||||||
Write.varint(0x0C) <> Write.varint(length(flags)) <> Enum.reduce(flags, "", fn id, acc -> acc <> Write.string(id) end)
|
Write.varint(0x0C) <> Write.varint(length(flags)) <> Write.list(flags, &Write.string/1)
|
||||||
end
|
end
|
||||||
# Update Tags https://wiki.vg/Protocol#Update_Tags
|
# Update Tags https://wiki.vg/Protocol#Update_Tags
|
||||||
def serialize({:update_tags, tags}) do
|
def serialize({:update_tags, tags}) do
|
||||||
@ -174,19 +170,17 @@ defmodule Amethyst.Server.Configuration do
|
|||||||
# Clientbound Known Packs https://wiki.vg/Protocol#Clientbound_Known_Packs
|
# Clientbound Known Packs https://wiki.vg/Protocol#Clientbound_Known_Packs
|
||||||
def serialize({:clientbound_known_packs, packs}) do
|
def serialize({:clientbound_known_packs, packs}) do
|
||||||
Write.varint(0x0E) <> Write.varint(length(packs)) <>
|
Write.varint(0x0E) <> Write.varint(length(packs)) <>
|
||||||
Enum.reduce(packs, "", fn {namespace, id, version}, acc -> acc <> Write.string(namespace) <> Write.string(id) <> Write.string(version) end)
|
Write.list(packs, fn {namespace, id, version} -> Write.string(namespace) <> Write.string(id) <> Write.string(version) end)
|
||||||
end
|
end
|
||||||
# Custom Report Details https://wiki.vg/Protocol#Custom_Report_Details
|
# Custom Report Details https://wiki.vg/Protocol#Custom_Report_Details
|
||||||
def serialize({:custom_report_details, details}) do
|
def serialize({:custom_report_details, details}) do
|
||||||
Write.varint(0x0F) <> Write.varint(length(details)) <>
|
Write.varint(0x0F) <> Write.varint(length(details)) <>
|
||||||
Enum.reduce(details, "", fn {id, data}, acc -> acc <> Write.string(id) <> Write.string(data) end)
|
Write.list(details, fn {id, data} -> Write.string(id) <> Write.string(data) end)
|
||||||
end
|
end
|
||||||
# Server Links https://wiki.vg/Protocol#Server_Links_(configuration)
|
# Server Links https://wiki.vg/Protocol#Server_Links_(configuration)
|
||||||
def serialize({:server_links, links}) do
|
def serialize({:server_links, links}) do
|
||||||
Write.varint(0x10) <> Write.varint(length(links)) <>
|
Write.varint(0x10) <> Write.varint(length(links)) <>
|
||||||
Enum.reduce(links, "", fn {label, url}, acc ->
|
Write.list(links, fn {label, url} -> serialize_link_label(label) <> Write.string(url) end)
|
||||||
acc <> serialize_link_label(label) <> Write.string(url)
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
def serialize(packet) do
|
def serialize(packet) do
|
||||||
raise ArgumentError, "Tried serializing unknown packet #{inspect(packet)}"
|
raise ArgumentError, "Tried serializing unknown packet #{inspect(packet)}"
|
||||||
@ -196,8 +190,10 @@ defmodule Amethyst.Server.Configuration do
|
|||||||
acc <> Write.string(id) <> Write.varint(length(elements)) <> serialize_elements(elements)
|
acc <> Write.string(id) <> Write.varint(length(elements)) <> serialize_elements(elements)
|
||||||
end
|
end
|
||||||
defp serialize_elements(elements) do
|
defp serialize_elements(elements) do
|
||||||
Enum.reduce(elements, "", fn {id, ids}, acc -> acc <> Write.string(id) <> Write.varint(length(ids)) <>
|
Write.list(elements, fn {id, ids} ->
|
||||||
Enum.reduce(ids, "", fn id, acc -> acc <> Write.varint(id) end) end)
|
Write.string(id) <> Write.varint(length(ids)) <>
|
||||||
|
Write.list(ids, &Write.varint/1)
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
defp serialize_link_label(:bug_report) do
|
defp serialize_link_label(:bug_report) do
|
||||||
<<0x01>> <> Write.varint(0x00)
|
<<0x01>> <> Write.varint(0x00)
|
||||||
|
Loading…
Reference in New Issue
Block a user