创建新工程
This commit is contained in:
583
scripts/FriendSystem.gd
Normal file
583
scripts/FriendSystem.gd
Normal file
@@ -0,0 +1,583 @@
|
||||
extends Node
|
||||
class_name FriendSystem
|
||||
## 好友系统
|
||||
## 管理玩家之间的好友关系和社交功能
|
||||
|
||||
# 好友关系数据结构
|
||||
class FriendRelationship:
|
||||
var friend_id: String
|
||||
var friend_name: String
|
||||
var status: String # "pending", "accepted", "blocked"
|
||||
var added_at: float
|
||||
var last_interaction: float
|
||||
var relationship_level: int = 1 # 关系等级 1-5
|
||||
var interaction_count: int = 0
|
||||
var shared_activities: Array[String] = []
|
||||
|
||||
func _init(id: String, name: String, relationship_status: String = "pending"):
|
||||
friend_id = id
|
||||
friend_name = name
|
||||
status = relationship_status
|
||||
added_at = Time.get_unix_time_from_system()
|
||||
last_interaction = added_at
|
||||
|
||||
# 好友数据存储
|
||||
var friends: Dictionary = {} # friend_id -> FriendRelationship
|
||||
var friend_requests: Dictionary = {} # requester_id -> FriendRelationship
|
||||
var blocked_users: Dictionary = {} # blocked_id -> timestamp
|
||||
var max_friends: int = 100
|
||||
var max_pending_requests: int = 20
|
||||
|
||||
# 数据持久化
|
||||
var friends_file_path: String = "user://friends_data.json"
|
||||
|
||||
# 信号
|
||||
signal friend_request_sent(friend_id: String, friend_name: String)
|
||||
# signal friend_request_received(requester_id: String, requester_name: String) # 暂时未使用
|
||||
signal friend_request_accepted(friend_id: String, friend_name: String)
|
||||
signal friend_request_declined(requester_id: String)
|
||||
signal friend_removed(friend_id: String, friend_name: String)
|
||||
signal friend_blocked(friend_id: String, friend_name: String)
|
||||
signal friend_unblocked(friend_id: String, friend_name: String)
|
||||
signal friend_online(friend_id: String, friend_name: String)
|
||||
signal friend_offline(friend_id: String, friend_name: String)
|
||||
signal relationship_level_changed(friend_id: String, old_level: int, new_level: int)
|
||||
|
||||
func _ready():
|
||||
"""初始化好友系统"""
|
||||
load_friends_data()
|
||||
print("FriendSystem initialized")
|
||||
|
||||
## 发送好友请求
|
||||
func send_friend_request(target_id: String, target_name: String) -> bool:
|
||||
"""
|
||||
向指定玩家发送好友请求
|
||||
@param target_id: 目标玩家ID
|
||||
@param target_name: 目标玩家名称
|
||||
@return: 是否成功发送
|
||||
"""
|
||||
# 验证输入
|
||||
if target_id.is_empty() or target_name.is_empty():
|
||||
print("Invalid target for friend request")
|
||||
return false
|
||||
|
||||
# 检查是否已经是好友
|
||||
if friends.has(target_id):
|
||||
print("Already friends with: ", target_name)
|
||||
return false
|
||||
|
||||
# 检查是否已发送过请求
|
||||
if friend_requests.has(target_id):
|
||||
print("Friend request already sent to: ", target_name)
|
||||
return false
|
||||
|
||||
# 检查是否被屏蔽
|
||||
if blocked_users.has(target_id):
|
||||
print("Cannot send friend request to blocked user: ", target_name)
|
||||
return false
|
||||
|
||||
# 检查好友数量限制
|
||||
if friends.size() >= max_friends:
|
||||
print("Friend list is full")
|
||||
return false
|
||||
|
||||
# 检查待处理请求数量
|
||||
if friend_requests.size() >= max_pending_requests:
|
||||
print("Too many pending friend requests")
|
||||
return false
|
||||
|
||||
# 创建好友请求
|
||||
var relationship = FriendRelationship.new(target_id, target_name, "pending")
|
||||
friend_requests[target_id] = relationship
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_request_sent.emit(target_id, target_name)
|
||||
|
||||
print("Friend request sent to: ", target_name)
|
||||
return true
|
||||
|
||||
## 接受好友请求
|
||||
func accept_friend_request(requester_id: String) -> bool:
|
||||
"""
|
||||
接受好友请求
|
||||
@param requester_id: 请求者ID
|
||||
@return: 是否成功接受
|
||||
"""
|
||||
if not friend_requests.has(requester_id):
|
||||
print("No friend request from: ", requester_id)
|
||||
return false
|
||||
|
||||
var relationship = friend_requests[requester_id]
|
||||
|
||||
# 检查好友数量限制
|
||||
if friends.size() >= max_friends:
|
||||
print("Friend list is full, cannot accept request")
|
||||
return false
|
||||
|
||||
# 移动到好友列表
|
||||
relationship.status = "accepted"
|
||||
friends[requester_id] = relationship
|
||||
friend_requests.erase(requester_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_request_accepted.emit(requester_id, relationship.friend_name)
|
||||
|
||||
print("Friend request accepted from: ", relationship.friend_name)
|
||||
return true
|
||||
|
||||
## 拒绝好友请求
|
||||
func decline_friend_request(requester_id: String) -> bool:
|
||||
"""
|
||||
拒绝好友请求
|
||||
@param requester_id: 请求者ID
|
||||
@return: 是否成功拒绝
|
||||
"""
|
||||
if not friend_requests.has(requester_id):
|
||||
print("No friend request from: ", requester_id)
|
||||
return false
|
||||
|
||||
var relationship = friend_requests[requester_id]
|
||||
friend_requests.erase(requester_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_request_declined.emit(requester_id)
|
||||
|
||||
print("Friend request declined from: ", relationship.friend_name)
|
||||
return true
|
||||
|
||||
## 移除好友
|
||||
func remove_friend(friend_id: String) -> bool:
|
||||
"""
|
||||
移除好友
|
||||
@param friend_id: 好友ID
|
||||
@return: 是否成功移除
|
||||
"""
|
||||
if not friends.has(friend_id):
|
||||
print("Not friends with: ", friend_id)
|
||||
return false
|
||||
|
||||
var relationship = friends[friend_id]
|
||||
friends.erase(friend_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_removed.emit(friend_id, relationship.friend_name)
|
||||
|
||||
print("Friend removed: ", relationship.friend_name)
|
||||
return true
|
||||
|
||||
## 屏蔽用户
|
||||
func block_user(user_id: String, user_name: String) -> bool:
|
||||
"""
|
||||
屏蔽用户
|
||||
@param user_id: 用户ID
|
||||
@param user_name: 用户名称
|
||||
@return: 是否成功屏蔽
|
||||
"""
|
||||
if blocked_users.has(user_id):
|
||||
print("User already blocked: ", user_name)
|
||||
return false
|
||||
|
||||
# 添加到屏蔽列表
|
||||
blocked_users[user_id] = Time.get_unix_time_from_system()
|
||||
|
||||
# 如果是好友,移除好友关系
|
||||
if friends.has(user_id):
|
||||
remove_friend(user_id)
|
||||
|
||||
# 如果有待处理的好友请求,移除
|
||||
if friend_requests.has(user_id):
|
||||
friend_requests.erase(user_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_blocked.emit(user_id, user_name)
|
||||
|
||||
print("User blocked: ", user_name)
|
||||
return true
|
||||
|
||||
## 解除屏蔽
|
||||
func unblock_user(user_id: String, user_name: String) -> bool:
|
||||
"""
|
||||
解除用户屏蔽
|
||||
@param user_id: 用户ID
|
||||
@param user_name: 用户名称
|
||||
@return: 是否成功解除屏蔽
|
||||
"""
|
||||
if not blocked_users.has(user_id):
|
||||
print("User not blocked: ", user_name)
|
||||
return false
|
||||
|
||||
blocked_users.erase(user_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
# 发射信号
|
||||
friend_unblocked.emit(user_id, user_name)
|
||||
|
||||
print("User unblocked: ", user_name)
|
||||
return true
|
||||
|
||||
## 记录互动
|
||||
func record_interaction(friend_id: String, activity_type: String = "chat") -> void:
|
||||
"""
|
||||
记录与好友的互动
|
||||
@param friend_id: 好友ID
|
||||
@param activity_type: 活动类型
|
||||
"""
|
||||
if not friends.has(friend_id):
|
||||
return
|
||||
|
||||
var relationship = friends[friend_id]
|
||||
relationship.last_interaction = Time.get_unix_time_from_system()
|
||||
relationship.interaction_count += 1
|
||||
|
||||
# 添加到共同活动
|
||||
if not activity_type in relationship.shared_activities:
|
||||
relationship.shared_activities.append(activity_type)
|
||||
|
||||
# 检查关系等级提升
|
||||
_check_relationship_level_up(friend_id)
|
||||
|
||||
# 保存数据
|
||||
save_friends_data()
|
||||
|
||||
## 检查关系等级提升
|
||||
func _check_relationship_level_up(friend_id: String) -> void:
|
||||
"""
|
||||
检查并处理关系等级提升
|
||||
@param friend_id: 好友ID
|
||||
"""
|
||||
if not friends.has(friend_id):
|
||||
return
|
||||
|
||||
var relationship = friends[friend_id]
|
||||
var old_level = relationship.relationship_level
|
||||
var new_level = _calculate_relationship_level(relationship)
|
||||
|
||||
if new_level > old_level:
|
||||
relationship.relationship_level = new_level
|
||||
relationship_level_changed.emit(friend_id, old_level, new_level)
|
||||
print("Relationship level increased with ", relationship.friend_name, ": ", old_level, " -> ", new_level)
|
||||
|
||||
## 计算关系等级
|
||||
func _calculate_relationship_level(relationship: FriendRelationship) -> int:
|
||||
"""
|
||||
根据互动数据计算关系等级
|
||||
@param relationship: 好友关系数据
|
||||
@return: 关系等级 (1-5)
|
||||
"""
|
||||
var level = 1
|
||||
|
||||
# 基于互动次数
|
||||
if relationship.interaction_count >= 10:
|
||||
level = 2
|
||||
if relationship.interaction_count >= 50:
|
||||
level = 3
|
||||
if relationship.interaction_count >= 100:
|
||||
level = 4
|
||||
if relationship.interaction_count >= 200:
|
||||
level = 5
|
||||
|
||||
# 基于共同活动种类
|
||||
var activity_bonus = min(relationship.shared_activities.size() / 3.0, 1)
|
||||
level = min(level + activity_bonus, 5)
|
||||
|
||||
# 基于关系持续时间(天数)
|
||||
var days_since_added = (Time.get_unix_time_from_system() - relationship.added_at) / 86400.0
|
||||
if days_since_added >= 7: # 一周
|
||||
level = min(level + 1, 5)
|
||||
|
||||
return level
|
||||
|
||||
## 获取好友列表
|
||||
func get_friends_list() -> Array[Dictionary]:
|
||||
"""
|
||||
获取好友列表
|
||||
@return: 好友信息数组
|
||||
"""
|
||||
var friends_list = []
|
||||
|
||||
for friend_id in friends:
|
||||
var relationship = friends[friend_id]
|
||||
friends_list.append({
|
||||
"id": friend_id,
|
||||
"name": relationship.friend_name,
|
||||
"status": relationship.status,
|
||||
"relationship_level": relationship.relationship_level,
|
||||
"last_interaction": relationship.last_interaction,
|
||||
"interaction_count": relationship.interaction_count,
|
||||
"shared_activities": relationship.shared_activities.duplicate(),
|
||||
"added_at": relationship.added_at
|
||||
})
|
||||
|
||||
# 按关系等级和最后互动时间排序
|
||||
friends_list.sort_custom(func(a, b):
|
||||
if a.relationship_level != b.relationship_level:
|
||||
return a.relationship_level > b.relationship_level
|
||||
return a.last_interaction > b.last_interaction
|
||||
)
|
||||
|
||||
return friends_list
|
||||
|
||||
## 获取好友请求列表
|
||||
func get_friend_requests() -> Array[Dictionary]:
|
||||
"""
|
||||
获取待处理的好友请求列表
|
||||
@return: 好友请求信息数组
|
||||
"""
|
||||
var requests = []
|
||||
|
||||
for requester_id in friend_requests:
|
||||
var relationship = friend_requests[requester_id]
|
||||
requests.append({
|
||||
"id": requester_id,
|
||||
"name": relationship.friend_name,
|
||||
"requested_at": relationship.added_at
|
||||
})
|
||||
|
||||
# 按请求时间排序(最新的在前)
|
||||
requests.sort_custom(func(a, b): return a.requested_at > b.requested_at)
|
||||
|
||||
return requests
|
||||
|
||||
## 获取屏蔽列表
|
||||
func get_blocked_users() -> Array[Dictionary]:
|
||||
"""
|
||||
获取屏蔽用户列表
|
||||
@return: 屏蔽用户信息数组
|
||||
"""
|
||||
var blocked = []
|
||||
|
||||
for user_id in blocked_users:
|
||||
blocked.append({
|
||||
"id": user_id,
|
||||
"blocked_at": blocked_users[user_id]
|
||||
})
|
||||
|
||||
# 按屏蔽时间排序(最新的在前)
|
||||
blocked.sort_custom(func(a, b): return a.blocked_at > b.blocked_at)
|
||||
|
||||
return blocked
|
||||
|
||||
## 检查是否为好友
|
||||
func is_friend(user_id: String) -> bool:
|
||||
"""
|
||||
检查是否为好友
|
||||
@param user_id: 用户ID
|
||||
@return: 是否为好友
|
||||
"""
|
||||
return friends.has(user_id) and friends[user_id].status == "accepted"
|
||||
|
||||
## 检查是否被屏蔽
|
||||
func is_blocked(user_id: String) -> bool:
|
||||
"""
|
||||
检查用户是否被屏蔽
|
||||
@param user_id: 用户ID
|
||||
@return: 是否被屏蔽
|
||||
"""
|
||||
return blocked_users.has(user_id)
|
||||
|
||||
## 获取好友信息
|
||||
func get_friend_info(friend_id: String) -> Dictionary:
|
||||
"""
|
||||
获取好友详细信息
|
||||
@param friend_id: 好友ID
|
||||
@return: 好友信息字典
|
||||
"""
|
||||
if not friends.has(friend_id):
|
||||
return {}
|
||||
|
||||
var relationship = friends[friend_id]
|
||||
return {
|
||||
"id": friend_id,
|
||||
"name": relationship.friend_name,
|
||||
"status": relationship.status,
|
||||
"relationship_level": relationship.relationship_level,
|
||||
"last_interaction": relationship.last_interaction,
|
||||
"interaction_count": relationship.interaction_count,
|
||||
"shared_activities": relationship.shared_activities.duplicate(),
|
||||
"added_at": relationship.added_at,
|
||||
"days_since_added": (Time.get_unix_time_from_system() - relationship.added_at) / 86400.0
|
||||
}
|
||||
|
||||
## 搜索好友
|
||||
func search_friends(query: String) -> Array[Dictionary]:
|
||||
"""
|
||||
搜索好友
|
||||
@param query: 搜索关键词
|
||||
@return: 匹配的好友信息数组
|
||||
"""
|
||||
var results = []
|
||||
var search_query = query.to_lower()
|
||||
|
||||
for friend_id in friends:
|
||||
var relationship = friends[friend_id]
|
||||
if relationship.friend_name.to_lower().contains(search_query):
|
||||
results.append(get_friend_info(friend_id))
|
||||
|
||||
return results
|
||||
|
||||
## 获取在线好友
|
||||
func get_online_friends(online_characters: Array[String]) -> Array[Dictionary]:
|
||||
"""
|
||||
获取当前在线的好友列表
|
||||
@param online_characters: 在线角色ID数组
|
||||
@return: 在线好友信息数组
|
||||
"""
|
||||
var online_friends = []
|
||||
|
||||
for friend_id in friends:
|
||||
if friend_id in online_characters:
|
||||
online_friends.append(get_friend_info(friend_id))
|
||||
|
||||
return online_friends
|
||||
|
||||
## 处理好友上线
|
||||
func handle_friend_online(friend_id: String) -> void:
|
||||
"""
|
||||
处理好友上线事件
|
||||
@param friend_id: 好友ID
|
||||
"""
|
||||
if friends.has(friend_id):
|
||||
var relationship = friends[friend_id]
|
||||
friend_online.emit(friend_id, relationship.friend_name)
|
||||
print("Friend came online: ", relationship.friend_name)
|
||||
|
||||
## 处理好友下线
|
||||
func handle_friend_offline(friend_id: String) -> void:
|
||||
"""
|
||||
处理好友下线事件
|
||||
@param friend_id: 好友ID
|
||||
"""
|
||||
if friends.has(friend_id):
|
||||
var relationship = friends[friend_id]
|
||||
friend_offline.emit(friend_id, relationship.friend_name)
|
||||
print("Friend went offline: ", relationship.friend_name)
|
||||
|
||||
## 保存好友数据
|
||||
func save_friends_data() -> void:
|
||||
"""保存好友数据到本地文件"""
|
||||
var data = {
|
||||
"friends": {},
|
||||
"friend_requests": {},
|
||||
"blocked_users": blocked_users
|
||||
}
|
||||
|
||||
# 序列化好友数据
|
||||
for friend_id in friends:
|
||||
var relationship = friends[friend_id]
|
||||
data.friends[friend_id] = {
|
||||
"friend_name": relationship.friend_name,
|
||||
"status": relationship.status,
|
||||
"added_at": relationship.added_at,
|
||||
"last_interaction": relationship.last_interaction,
|
||||
"relationship_level": relationship.relationship_level,
|
||||
"interaction_count": relationship.interaction_count,
|
||||
"shared_activities": relationship.shared_activities
|
||||
}
|
||||
|
||||
# 序列化好友请求数据
|
||||
for requester_id in friend_requests:
|
||||
var relationship = friend_requests[requester_id]
|
||||
data.friend_requests[requester_id] = {
|
||||
"friend_name": relationship.friend_name,
|
||||
"status": relationship.status,
|
||||
"added_at": relationship.added_at
|
||||
}
|
||||
|
||||
var file = FileAccess.open(friends_file_path, FileAccess.WRITE)
|
||||
if file:
|
||||
var json_string = JSON.stringify(data)
|
||||
file.store_string(json_string)
|
||||
file.close()
|
||||
print("Friends data saved")
|
||||
else:
|
||||
print("Failed to save friends data")
|
||||
|
||||
## 加载好友数据
|
||||
func load_friends_data() -> void:
|
||||
"""从本地文件加载好友数据"""
|
||||
if not FileAccess.file_exists(friends_file_path):
|
||||
print("No friends data file found, starting fresh")
|
||||
return
|
||||
|
||||
var file = FileAccess.open(friends_file_path, FileAccess.READ)
|
||||
if file:
|
||||
var json_string = file.get_as_text()
|
||||
file.close()
|
||||
|
||||
var json = JSON.new()
|
||||
var parse_result = json.parse(json_string)
|
||||
|
||||
if parse_result == OK:
|
||||
var data = json.data
|
||||
|
||||
# 加载好友数据
|
||||
if data.has("friends"):
|
||||
for friend_id in data.friends:
|
||||
var friend_data = data.friends[friend_id]
|
||||
var relationship = FriendRelationship.new(friend_id, friend_data.friend_name, friend_data.status)
|
||||
relationship.added_at = friend_data.get("added_at", Time.get_unix_time_from_system())
|
||||
relationship.last_interaction = friend_data.get("last_interaction", relationship.added_at)
|
||||
relationship.relationship_level = friend_data.get("relationship_level", 1)
|
||||
relationship.interaction_count = friend_data.get("interaction_count", 0)
|
||||
relationship.shared_activities = friend_data.get("shared_activities", [])
|
||||
friends[friend_id] = relationship
|
||||
|
||||
# 加载好友请求数据
|
||||
if data.has("friend_requests"):
|
||||
for requester_id in data.friend_requests:
|
||||
var request_data = data.friend_requests[requester_id]
|
||||
var relationship = FriendRelationship.new(requester_id, request_data.friend_name, request_data.status)
|
||||
relationship.added_at = request_data.get("added_at", Time.get_unix_time_from_system())
|
||||
friend_requests[requester_id] = relationship
|
||||
|
||||
# 加载屏蔽数据
|
||||
if data.has("blocked_users"):
|
||||
blocked_users = data.blocked_users
|
||||
|
||||
print("Friends data loaded: ", friends.size(), " friends, ", friend_requests.size(), " requests, ", blocked_users.size(), " blocked")
|
||||
else:
|
||||
print("Failed to parse friends data JSON")
|
||||
else:
|
||||
print("Failed to open friends data file")
|
||||
|
||||
## 获取统计信息
|
||||
func get_statistics() -> Dictionary:
|
||||
"""
|
||||
获取好友系统统计信息
|
||||
@return: 统计信息字典
|
||||
"""
|
||||
var level_counts = {}
|
||||
var total_interactions = 0
|
||||
|
||||
for friend_id in friends:
|
||||
var relationship = friends[friend_id]
|
||||
var level = relationship.relationship_level
|
||||
level_counts[level] = level_counts.get(level, 0) + 1
|
||||
total_interactions += relationship.interaction_count
|
||||
|
||||
return {
|
||||
"total_friends": friends.size(),
|
||||
"pending_requests": friend_requests.size(),
|
||||
"blocked_users": blocked_users.size(),
|
||||
"total_interactions": total_interactions,
|
||||
"level_distribution": level_counts,
|
||||
"max_friends": max_friends,
|
||||
"max_pending_requests": max_pending_requests
|
||||
}
|
||||
Reference in New Issue
Block a user