Add multiplayer item use and session chat
This commit is contained in:
parent
5e04b70609
commit
5dda74c9e4
27 changed files with 1361 additions and 31 deletions
83
network/network_item_protocol.gd
Normal file
83
network/network_item_protocol.gd
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
class_name NetworkItemProtocol
|
||||
extends RefCounted
|
||||
|
||||
const ITEM_USE_CAPABILITY: StringName = &"item_use_v1"
|
||||
const EQUIPMENT_CAPABILITY: StringName = &"equipment_v1"
|
||||
const RELIABLE_CHANNEL: int = NetworkProtocol.ITEM_RELIABLE_CHANNEL
|
||||
const MAX_ID_LENGTH: int = 96
|
||||
const MAX_ITEM_ID_LENGTH: int = 96
|
||||
const MAX_MESSAGE_LENGTH: int = 160
|
||||
|
||||
|
||||
static func validate_use_request(data: Variant) -> String:
|
||||
if typeof(data) != TYPE_DICTIONARY:
|
||||
return "Item use could not be completed."
|
||||
var value: Dictionary = data
|
||||
for key: String in [
|
||||
"request_id", "session_id", "item_id", "quantity",
|
||||
]:
|
||||
if not value.has(key):
|
||||
return "Item use could not be completed."
|
||||
if (
|
||||
not _valid_id(value["request_id"])
|
||||
or not _valid_id(value["session_id"])
|
||||
or typeof(value["item_id"]) not in [TYPE_STRING, TYPE_STRING_NAME]
|
||||
or str(value["item_id"]).is_empty()
|
||||
or str(value["item_id"]).length() > MAX_ITEM_ID_LENGTH
|
||||
or typeof(value["quantity"]) != TYPE_INT
|
||||
or int(value["quantity"]) < 1
|
||||
or int(value["quantity"]) > 99
|
||||
):
|
||||
return "Item use could not be completed."
|
||||
return ""
|
||||
|
||||
|
||||
static func validate_use_result(data: Variant) -> bool:
|
||||
if typeof(data) != TYPE_DICTIONARY:
|
||||
return false
|
||||
var value: Dictionary = data
|
||||
return (
|
||||
_valid_id(value.get("result_id"))
|
||||
and _valid_id(value.get("request_id"))
|
||||
and _valid_id(value.get("session_id"))
|
||||
and typeof(value.get("target_peer_id")) == TYPE_INT
|
||||
and typeof(value.get("accepted")) == TYPE_BOOL
|
||||
and typeof(value.get("item_id")) in [TYPE_STRING, TYPE_STRING_NAME]
|
||||
and not str(value["item_id"]).is_empty()
|
||||
and str(value["item_id"]).length() <= MAX_ITEM_ID_LENGTH
|
||||
and typeof(value.get("quantity")) == TYPE_INT
|
||||
and int(value["quantity"]) >= 0
|
||||
and int(value["quantity"]) <= 1
|
||||
and typeof(value.get("duration")) in [TYPE_FLOAT, TYPE_INT]
|
||||
and is_finite(float(value["duration"]))
|
||||
and float(value["duration"]) >= 0.0
|
||||
and typeof(value.get("message")) == TYPE_STRING
|
||||
and str(value["message"]).length() <= MAX_MESSAGE_LENGTH
|
||||
)
|
||||
|
||||
|
||||
static func validate_equipped_state(data: Variant) -> bool:
|
||||
if typeof(data) != TYPE_DICTIONARY:
|
||||
return false
|
||||
var value: Dictionary = data
|
||||
return (
|
||||
_valid_id(value.get("session_id"))
|
||||
and typeof(value.get("owner_peer_id")) == TYPE_INT
|
||||
and int(value["owner_peer_id"]) > 0
|
||||
and typeof(value.get("item_id")) in [TYPE_STRING, TYPE_STRING_NAME]
|
||||
and str(value["item_id"]).length() <= MAX_ITEM_ID_LENGTH
|
||||
and typeof(value.get("category")) == TYPE_INT
|
||||
and int(value["category"]) >= -1
|
||||
and int(value["category"]) < ItemData.Category.size()
|
||||
and typeof(value.get("revision")) == TYPE_INT
|
||||
and int(value["revision"]) >= 0
|
||||
and typeof(value.get("owns_item")) == TYPE_BOOL
|
||||
)
|
||||
|
||||
|
||||
static func _valid_id(value: Variant) -> bool:
|
||||
return (
|
||||
typeof(value) == TYPE_STRING
|
||||
and not str(value).is_empty()
|
||||
and str(value).length() <= MAX_ID_LENGTH
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue