From c8cc104327f3079056dc9898a8093ba90cd511b3 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sun, 11 Aug 2024 10:48:23 +0800 Subject: [PATCH 01/16] New: lua surport the module function hot update --- src/lua/common/module_mgr.lua | 23 +++++++++++++++-------- src/lua/main.lua | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/lua/common/module_mgr.lua b/src/lua/common/module_mgr.lua index 0384d12a..08af5896 100644 --- a/src/lua/common/module_mgr.lua +++ b/src/lua/common/module_mgr.lua @@ -6,7 +6,8 @@ ----------------------------------------------------------------------------- ModuleMgr = { - modules = {} + modules = {}, + modules_info = {} } -- pre_path: 模块路径 @@ -27,14 +28,15 @@ function ModuleMgr:Register(pre_path, list) Squick:LogInfo("lua start to load " .. name); local old_module = ModuleMgr.modules[name] - local object = require(path); - if object then + local new_module = require(path); + if new_module then if old_module ~= nil then - Squick:LogInfo("reload " .. path.. " succeed"); - -- 只更新函数 + Squick:LogInfo("Begin hot reload " .. path); + self:HotReload(old_module, new_module) + Squick:LogInfo("Hot reload " .. path.. " succeed"); else - ModuleMgr.modules[name] = object -- 加载全部 + ModuleMgr.modules[name] = new_module -- 加载全部 Squick:LogInfo("load " .. path .. " succeed"); end else @@ -47,8 +49,13 @@ function ModuleMgr:Register(pre_path, list) return true end -function ModuleMgr:HotReload() - +function ModuleMgr:HotReload(old_module, new_module) + for key, value in pairs(new_module) do + if type(value) == "function" then + Squick:LogInfo("reloading function " .. key) + old_module[key] = value + end + end end function ModuleMgr:Start() diff --git a/src/lua/main.lua b/src/lua/main.lua index dff3b2da..effeb037 100644 --- a/src/lua/main.lua +++ b/src/lua/main.lua @@ -16,6 +16,7 @@ function Print(...) end function Require(file) + package.loaded[file] = nil require(file) end From 3321c002ad91920181fababaae324fad8673ccf0 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sun, 11 Aug 2024 15:44:36 +0800 Subject: [PATCH 02/16] Remove the config plugin in proxy node --- config/plugin/proxy.xml | 1 - src/node/proxy/logic/logic_module.cc | 1 - src/node/proxy/logic/logic_module.h | 1 - 3 files changed, 3 deletions(-) diff --git a/config/plugin/proxy.xml b/config/plugin/proxy.xml index a0689d10..aacb0f4b 100644 --- a/config/plugin/proxy.xml +++ b/config/plugin/proxy.xml @@ -1,7 +1,6 @@ - diff --git a/src/node/proxy/logic/logic_module.cc b/src/node/proxy/logic/logic_module.cc index 38347a67..b7455d64 100644 --- a/src/node/proxy/logic/logic_module.cc +++ b/src/node/proxy/logic/logic_module.cc @@ -14,7 +14,6 @@ bool LogicModule::Destroy() { return true; } bool LogicModule::Update() { return true; } bool LogicModule::AfterStart() { - m_class_ = pm_->FindModule(); m_net_ = pm_->FindModule(); m_net_client_ = pm_->FindModule(); m_log_ = pm_->FindModule(); diff --git a/src/node/proxy/logic/logic_module.h b/src/node/proxy/logic/logic_module.h index 8f5e8fac..10cecf06 100644 --- a/src/node/proxy/logic/logic_module.h +++ b/src/node/proxy/logic/logic_module.h @@ -95,7 +95,6 @@ class LogicModule : public ILogicModule { protected: ILogModule *m_log_; - IClassModule *m_class_; IScheduleModule *m_schedule_; INetModule *m_net_; IWSModule *m_ws_; From d906cb28f2c95bd1a770c52c7686a67bf4e846c8 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sun, 11 Aug 2024 23:10:31 +0800 Subject: [PATCH 03/16] Update: node connect ip can set as hostname --- src/squick/plugin/net/net.cc | 56 ++++++++++++++++++++++++++++++++++++ src/squick/plugin/net/net.h | 3 ++ 2 files changed, 59 insertions(+) diff --git a/src/squick/plugin/net/net.cc b/src/squick/plugin/net/net.cc index ccab17f1..ce6b0d42 100644 --- a/src/squick/plugin/net/net.cc +++ b/src/squick/plugin/net/net.cc @@ -9,6 +9,7 @@ #include #include +#include #include "net.h" @@ -313,10 +314,65 @@ bool Net::AddNetObject(const socket_t sock, NetObject *pObject) { return mmObject.insert(std::map::value_type(sock, pObject)).second; } +bool Net::IsValidIP(const std::string& ip) { + std::regex ip_regex( + "^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" // 1-3 numbers + "(?:\\." + "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" // 1-3 numbers + "){3}" // repeate 3 group + "(?:\\." + "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" // 1-3 numbers + ")$" // end + ); + + return std::regex_match(ip, ip_regex); +} + +bool Net::IsValidDomain(const std::string& domain) { + std::regex domain_regex( + "[a-zA-Z0-9]+" + "(?:\\.[a-zA-Z0-9]+)+" + ); + + return std::regex_match(domain, domain_regex); +} + +std::string Net::GetIpByDomain(std::string domain) { + + struct hostent *hptr; + hptr = gethostbyname(domain.c_str()); + if (hptr == NULL) { + printf("gethostbyname error for host: %s: %s\n", domain.c_str(), hstrerror(h_errno)); + return ""; + } + + char **pptr; + char str[INET_ADDRSTRLEN]; + for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) + { + printf("\ttalias: %s\n", *pptr); + } + + // output ip + for (pptr = hptr->h_addr_list; *pptr!=NULL; pptr++) + { + std::string ip = inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)); + return ip; + } + + return ""; +} + int Net::StartClientNet() { std::string ip = mstrIP; int nPort = mnPort; + if (!IsValidIP(ip)) + { + // domain to ip + ip = GetIpByDomain(ip); + } + struct sockaddr_in addr; struct bufferevent *bev = NULL; diff --git a/src/squick/plugin/net/net.h b/src/squick/plugin/net/net.h index b4c44f61..ac2b7cb6 100644 --- a/src/squick/plugin/net/net.h +++ b/src/squick/plugin/net/net.h @@ -87,6 +87,9 @@ class Net : public INet { int StartClientNet(); int StartServerNet(); void CloseObject(const socket_t sock); + bool IsValidIP(const std::string& ip); + bool IsValidDomain(const std::string& domain); + std::string GetIpByDomain(std::string domain); static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *user_data); static void conn_readcb(struct bufferevent *bev, void *user_data); From 88b345bbcef101c796da0bfdd538862a3affab4f Mon Sep 17 00:00:00 2001 From: i0gan Date: Mon, 12 Aug 2024 00:03:59 +0800 Subject: [PATCH 04/16] Update: k8s config --- docker/build_image.sh | 4 +-- kubernetes/gen_k8s_config.sh | 5 +++- kubernetes/{node => tmpl}/master.yaml | 4 +-- kubernetes/tmpl/master_svc.yaml | 12 ++++++++ kubernetes/tmpl/proxy.yaml | 40 +++++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 5 deletions(-) rename kubernetes/{node => tmpl}/master.yaml (95%) create mode 100644 kubernetes/tmpl/master_svc.yaml create mode 100644 kubernetes/tmpl/proxy.yaml diff --git a/docker/build_image.sh b/docker/build_image.sh index 17c72deb..1c7a8df5 100755 --- a/docker/build_image.sh +++ b/docker/build_image.sh @@ -6,8 +6,8 @@ source ../tools/common.sh build_type='docker' is_build_third_party=0 is_build_sqkctl=0 -src_image_tag=pwnsky/squick_src:1.1 -bin_image_tag=pwnsky/squick:1.1 +src_image_tag=pwnsky/squick_src:1.2 +bin_image_tag=pwnsky/squick:1.2 build_container=squick_src_build cd $project_path diff --git a/kubernetes/gen_k8s_config.sh b/kubernetes/gen_k8s_config.sh index 99b989f0..340f2e12 100755 --- a/kubernetes/gen_k8s_config.sh +++ b/kubernetes/gen_k8s_config.sh @@ -1,6 +1,9 @@ #! /bin/bash namespace="pwnsky" -image="pwnsky" +image="pwnsky/squick:1.1" + +rm -rf k8s_cfg +mkdir -p k8s_cfg diff --git a/kubernetes/node/master.yaml b/kubernetes/tmpl/master.yaml similarity index 95% rename from kubernetes/node/master.yaml rename to kubernetes/tmpl/master.yaml index ed71fb35..bb10793c 100644 --- a/kubernetes/node/master.yaml +++ b/kubernetes/tmpl/master.yaml @@ -8,7 +8,7 @@ metadata: app: squick spec: serviceName: "svc-squick-master" - replicas: 2 + replicas: 3 selector: matchLabels: app: squick @@ -19,7 +19,7 @@ spec: spec: containers: - name: squick - image: pwnsky/squick:1.1 + image: pwnsky/squick:1.2 imagePullPolicy: Never command: ["/bin/bash", "-c"] args: diff --git a/kubernetes/tmpl/master_svc.yaml b/kubernetes/tmpl/master_svc.yaml new file mode 100644 index 00000000..a77fa871 --- /dev/null +++ b/kubernetes/tmpl/master_svc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: svc-squick-master +spec: + selector: + app: squick + ports: + - protocol: TCP + port: 10001 + targetPort: 10001 + type: ClusterIP diff --git a/kubernetes/tmpl/proxy.yaml b/kubernetes/tmpl/proxy.yaml new file mode 100644 index 00000000..8c22b5a4 --- /dev/null +++ b/kubernetes/tmpl/proxy.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: squick-proxy + namespace: default + labels: + app: squick +spec: + serviceName: "svc-squick-proxy" + replicas: 3 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=proxy id=500${HOSTNAME##*-} area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=squick-master-0 master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace From 6a86bb49289138bcbee5b090db042f33259b37f2 Mon Sep 17 00:00:00 2001 From: i0gan Date: Mon, 12 Aug 2024 13:14:58 +0800 Subject: [PATCH 05/16] Bugfix: Cannot build net plugin on windows --- src/squick/plugin/net/net.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/squick/plugin/net/net.cc b/src/squick/plugin/net/net.cc index ce6b0d42..63788714 100644 --- a/src/squick/plugin/net/net.cc +++ b/src/squick/plugin/net/net.cc @@ -342,16 +342,16 @@ std::string Net::GetIpByDomain(std::string domain) { struct hostent *hptr; hptr = gethostbyname(domain.c_str()); if (hptr == NULL) { - printf("gethostbyname error for host: %s: %s\n", domain.c_str(), hstrerror(h_errno)); + //printf("gethostbyname error for host: %s: %s\n", domain.c_str(), hstrerror(h_errno)); return ""; } char **pptr; char str[INET_ADDRSTRLEN]; - for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) - { - printf("\ttalias: %s\n", *pptr); - } + // for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) + // { + // printf("\ttalias: %s\n", *pptr); + // } // output ip for (pptr = hptr->h_addr_list; *pptr!=NULL; pptr++) From a6c5047be3a1b19008129a0b9160b39687626826 Mon Sep 17 00:00:00 2001 From: i0gan Date: Mon, 12 Aug 2024 14:07:35 +0000 Subject: [PATCH 06/16] Update: image script --- docker/build_image.sh | 17 +++++++++++++---- docker/release | 13 +++---------- docker/release_mini | 18 ++++++++++++++++++ docker/src_dep | 15 +++++++++++++++ tools/generate_k8s_deploy.sh | 7 +++++++ 5 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 docker/release_mini create mode 100644 docker/src_dep create mode 100755 tools/generate_k8s_deploy.sh diff --git a/docker/build_image.sh b/docker/build_image.sh index 1c7a8df5..02f75c19 100755 --- a/docker/build_image.sh +++ b/docker/build_image.sh @@ -3,17 +3,22 @@ cd $(dirname $0) source ../tools/common.sh -build_type='docker' +version=$1 +if [[ $version == "" ]];then + version="1.2" +fi + +dockerfile=./docker/src_dep is_build_third_party=0 is_build_sqkctl=0 -src_image_tag=pwnsky/squick_src:1.2 -bin_image_tag=pwnsky/squick:1.2 +src_image_tag=pwnsky/squick_src:$version +bin_image_tag=pwnsky/squick:$version build_container=squick_src_build cd $project_path echo "Build src image" -docker build . -t $src_image_tag -f ./docker/src +docker build . -t $src_image_tag -f $dockerfile check_err echo "Export binary files" @@ -33,5 +38,9 @@ echo "Build release image" docker build . -t $bin_image_tag -f ./docker/release check_err +echo "Exporting the image" +docker save -o ../cache/squick_$version.tar pwnsky/squick:$version +check_err + echo "Build image ok" print_ok diff --git a/docker/release b/docker/release index bfe5f204..4622bd0c 100644 --- a/docker/release +++ b/docker/release @@ -1,18 +1,11 @@ -# cd {squick_project} -# docker build . -t i0gan/squick_src:1.1 -f ./docker/src -# docker run -d --name squick_src i0gan/squick_src:1.1 -# rm -rf ./cache/docker_deploy -# docker cp squick_src:/squick/deploy ./cache/docker_deploy - -# docker build . -t i0gan/squick:1.1 -f ./docker/release -# docker run -it --name squick i0gan/squick:1.1 - FROM ubuntu:22.04 + # Set env ARG DEBIAN_FRONTEND=noninteractive +RUN apt update && apt install -y dos2unix vim net-tools # copy from docker builded files COPY ./cache/docker_deploy /squick WORKDIR /squick RUN chmod +x /squick/script/*.sh -CMD bash /squick/script/squick.sh \ No newline at end of file +CMD bash /squick/script/squick.sh diff --git a/docker/release_mini b/docker/release_mini new file mode 100644 index 00000000..bfe5f204 --- /dev/null +++ b/docker/release_mini @@ -0,0 +1,18 @@ +# cd {squick_project} +# docker build . -t i0gan/squick_src:1.1 -f ./docker/src +# docker run -d --name squick_src i0gan/squick_src:1.1 +# rm -rf ./cache/docker_deploy +# docker cp squick_src:/squick/deploy ./cache/docker_deploy + +# docker build . -t i0gan/squick:1.1 -f ./docker/release +# docker run -it --name squick i0gan/squick:1.1 + +FROM ubuntu:22.04 +# Set env +ARG DEBIAN_FRONTEND=noninteractive + +# copy from docker builded files +COPY ./cache/docker_deploy /squick +WORKDIR /squick +RUN chmod +x /squick/script/*.sh +CMD bash /squick/script/squick.sh \ No newline at end of file diff --git a/docker/src_dep b/docker/src_dep new file mode 100644 index 00000000..3753f0ab --- /dev/null +++ b/docker/src_dep @@ -0,0 +1,15 @@ +FROM pwnsky/squick_src:1.1 + +COPY . /squick_dep + +RUN rm -rf /squick_dep/third_party && mv /squick/third_party /squick_dep && rm -rf /squick && mv /squick_dep /squick + +WORKDIR /squick +RUN cd tools && chmod +x *.sh && dos2unix *.sh +RUN cd script && chmod +x *.sh && dos2unix *.sh + +RUN bash ./tools/clean_squick.sh +RUN bash ./tools/build_sqkctl.sh +RUN bash ./tools/build_squick.sh +RUN bash ./tools/generate_deploy.sh +CMD bash /squick/script/squick.sh diff --git a/tools/generate_k8s_deploy.sh b/tools/generate_k8s_deploy.sh new file mode 100755 index 00000000..623e8548 --- /dev/null +++ b/tools/generate_k8s_deploy.sh @@ -0,0 +1,7 @@ +#! /bin/bash + +# build image +bash ../docker/build_image.sh + + + From e5df3b766ba150704f4f2acf8ee0e35d13b0a956 Mon Sep 17 00:00:00 2001 From: i0gan Date: Thu, 15 Aug 2024 14:09:35 +0800 Subject: [PATCH 07/16] Update the k8s configure --- docker/build_image.sh | 5 +++-- kubernetes/tmpl/proxy.yaml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/build_image.sh b/docker/build_image.sh index 02f75c19..aad99e15 100755 --- a/docker/build_image.sh +++ b/docker/build_image.sh @@ -8,7 +8,7 @@ if [[ $version == "" ]];then version="1.2" fi -dockerfile=./docker/src_dep +dockerfile=./docker/src is_build_third_party=0 is_build_sqkctl=0 src_image_tag=pwnsky/squick_src:$version @@ -24,6 +24,7 @@ check_err echo "Export binary files" docker run -d --name $build_container $src_image_tag check_err +mkdir -p ./cache rm -rf ./cache/docker_deploy docker cp $build_container:/squick/deploy ./cache/docker_deploy check_err @@ -39,7 +40,7 @@ docker build . -t $bin_image_tag -f ./docker/release check_err echo "Exporting the image" -docker save -o ../cache/squick_$version.tar pwnsky/squick:$version +docker save -o ./cache/squick_$version.tar pwnsky/squick:$version check_err echo "Build image ok" diff --git a/kubernetes/tmpl/proxy.yaml b/kubernetes/tmpl/proxy.yaml index 8c22b5a4..da55a08a 100644 --- a/kubernetes/tmpl/proxy.yaml +++ b/kubernetes/tmpl/proxy.yaml @@ -24,7 +24,7 @@ spec: command: ["/bin/bash", "-c"] args: - > - /squick/script/squick.sh type=proxy id=500${HOSTNAME##*-} area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=squick-master-0 master_port=10001 logshow=0 + /squick/script/squick.sh type=proxy id=500${HOSTNAME##*-} area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master.default.svc.cluster.local master_port=10001 logshow=0 env: - name: POD_NAME valueFrom: From d095ce1a2ec35f0d58ae8df036d1e345af1edbc2 Mon Sep 17 00:00:00 2001 From: i0gan Date: Fri, 16 Aug 2024 21:02:05 +0800 Subject: [PATCH 08/16] update k8s configure --- kubernetes/tmpl/backstage.yaml | 39 ++++++++++++++++++++++++++++++++ kubernetes/tmpl/db_proxy.yaml | 39 ++++++++++++++++++++++++++++++++ kubernetes/tmpl/master.yaml | 15 ++++++++++++- kubernetes/tmpl/master_svc.yaml | 12 ---------- kubernetes/tmpl/player.yaml | 40 +++++++++++++++++++++++++++++++++ kubernetes/tmpl/proxy.yaml | 6 ++--- kubernetes/tmpl/web.yaml | 40 +++++++++++++++++++++++++++++++++ kubernetes/tmpl/world.yaml | 40 +++++++++++++++++++++++++++++++++ 8 files changed, 215 insertions(+), 16 deletions(-) create mode 100644 kubernetes/tmpl/backstage.yaml create mode 100644 kubernetes/tmpl/db_proxy.yaml delete mode 100644 kubernetes/tmpl/master_svc.yaml create mode 100644 kubernetes/tmpl/player.yaml create mode 100644 kubernetes/tmpl/web.yaml create mode 100644 kubernetes/tmpl/world.yaml diff --git a/kubernetes/tmpl/backstage.yaml b/kubernetes/tmpl/backstage.yaml new file mode 100644 index 00000000..1c565056 --- /dev/null +++ b/kubernetes/tmpl/backstage.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: backstage + namespace: default + labels: + app: squick +spec: + replicas: 1 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=backstage id=`expr 2500 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace diff --git a/kubernetes/tmpl/db_proxy.yaml b/kubernetes/tmpl/db_proxy.yaml new file mode 100644 index 00000000..ceaa9427 --- /dev/null +++ b/kubernetes/tmpl/db_proxy.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: db-proxy + namespace: default + labels: + app: squick +spec: + replicas: 3 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=proxy id=`expr 2000 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace diff --git a/kubernetes/tmpl/master.yaml b/kubernetes/tmpl/master.yaml index bb10793c..f2f78162 100644 --- a/kubernetes/tmpl/master.yaml +++ b/kubernetes/tmpl/master.yaml @@ -24,7 +24,7 @@ spec: command: ["/bin/bash", "-c"] args: - > - /squick/script/squick.sh type=master id=1000${HOSTNAME##*-} area=0 ip=$(POD_IP) port=10001 http_port=50000 logshow=0 + /squick/script/squick.sh type=master id=`expr 1 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10001 http_port=50000 logshow=0 env: - name: POD_NAME valueFrom: @@ -38,3 +38,16 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-squick-master +spec: + selector: + app: squick + ports: + - protocol: TCP + port: 10001 + targetPort: 10001 + type: ClusterIP diff --git a/kubernetes/tmpl/master_svc.yaml b/kubernetes/tmpl/master_svc.yaml deleted file mode 100644 index a77fa871..00000000 --- a/kubernetes/tmpl/master_svc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: svc-squick-master -spec: - selector: - app: squick - ports: - - protocol: TCP - port: 10001 - targetPort: 10001 - type: ClusterIP diff --git a/kubernetes/tmpl/player.yaml b/kubernetes/tmpl/player.yaml new file mode 100644 index 00000000..fe4ccee7 --- /dev/null +++ b/kubernetes/tmpl/player.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: squick-player + namespace: default + labels: + app: squick +spec: + #serviceName: "svc-squick-proxy" + replicas: 3 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=player id=`expr 1000 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10401 master_ip=svc-squick-master master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace diff --git a/kubernetes/tmpl/proxy.yaml b/kubernetes/tmpl/proxy.yaml index da55a08a..5cfe2919 100644 --- a/kubernetes/tmpl/proxy.yaml +++ b/kubernetes/tmpl/proxy.yaml @@ -2,12 +2,12 @@ apiVersion: apps/v1 kind: StatefulSet metadata: - name: squick-proxy + name: proxy namespace: default labels: app: squick spec: - serviceName: "svc-squick-proxy" + #serviceName: "svc-squick-proxy" replicas: 3 selector: matchLabels: @@ -24,7 +24,7 @@ spec: command: ["/bin/bash", "-c"] args: - > - /squick/script/squick.sh type=proxy id=500${HOSTNAME##*-} area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master.default.svc.cluster.local master_port=10001 logshow=0 + /squick/script/squick.sh type=proxy id=`expr 500 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master master_port=10001 logshow=0 env: - name: POD_NAME valueFrom: diff --git a/kubernetes/tmpl/web.yaml b/kubernetes/tmpl/web.yaml new file mode 100644 index 00000000..d007a1d4 --- /dev/null +++ b/kubernetes/tmpl/web.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: web + namespace: default + labels: + app: squick +spec: + serviceName: "svc-squick-web" + replicas: 3 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=proxy id=`expr 2000 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace diff --git a/kubernetes/tmpl/world.yaml b/kubernetes/tmpl/world.yaml new file mode 100644 index 00000000..648ad298 --- /dev/null +++ b/kubernetes/tmpl/world.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: world + namespace: default + labels: + app: squick +spec: + serviceName: "svc-squick-web" + replicas: 3 + selector: + matchLabels: + app: squick + template: + metadata: + labels: + app: squick + spec: + containers: + - name: squick + image: pwnsky/squick:1.2 + imagePullPolicy: Never + command: ["/bin/bash", "-c"] + args: + - > + /squick/script/squick.sh type=world id=`expr 2000 + ${HOSTNAME##*-}` area=0 ip=$(POD_IP) port=10501 ws_port=10502 master_ip=svc-squick-master master_port=10001 logshow=0 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace From 0d7cbfe1e4530843d893aadd7690e80797f9882b Mon Sep 17 00:00:00 2001 From: i0gan Date: Sat, 24 Aug 2024 20:34:41 +0800 Subject: [PATCH 09/16] Added go lib --- src/node/backstage/golib/go.mod | 38 +++++++++++++ src/node/backstage/golib/go.sum | 95 ++++++++++++++++++++++++++++++++ src/node/backstage/golib/main.go | 38 +++++++++++++ tools/binary_strip.sh | 4 ++ 4 files changed, 175 insertions(+) create mode 100644 src/node/backstage/golib/go.mod create mode 100644 src/node/backstage/golib/go.sum create mode 100644 src/node/backstage/golib/main.go create mode 100755 tools/binary_strip.sh diff --git a/src/node/backstage/golib/go.mod b/src/node/backstage/golib/go.mod new file mode 100644 index 00000000..c433d081 --- /dev/null +++ b/src/node/backstage/golib/go.mod @@ -0,0 +1,38 @@ +module golib + +go 1.22.5 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/go-pay/gopay v1.5.104 + github.com/go-pay/xlog v0.0.3 +) + +require ( + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/src/node/backstage/golib/go.sum b/src/node/backstage/golib/go.sum new file mode 100644 index 00000000..f3f25113 --- /dev/null +++ b/src/node/backstage/golib/go.sum @@ -0,0 +1,95 @@ +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-pay/gopay v1.5.104 h1:XMftoDnMf/2P3o11jYzqvAzAihum5fVPQVmQ6LgSeEY= +github.com/go-pay/gopay v1.5.104/go.mod h1:1Ywz2i8x96NrFa+F0TKDF7tQl7AZs4DxAc0kh069gJg= +github.com/go-pay/util v0.0.3 h1:0OjERb7MAVpM2gLPnBESLdMsosYyJ4i31V2/YZBiPjw= +github.com/go-pay/util v0.0.3/go.mod h1:qM8VbyF1n7YAPZBSJONSPMPsPedhUTktewUAdf1AjPg= +github.com/go-pay/xlog v0.0.3 h1:avyMhCL/JgBHreoGx/am/kHxfs1udDOAeVqbmzP/Yes= +github.com/go-pay/xlog v0.0.3/go.mod h1:mH47xbobrdsSHWsmFtSF5agWbMHFP+tK0ZbVCk5OAEw= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/src/node/backstage/golib/main.go b/src/node/backstage/golib/main.go new file mode 100644 index 00000000..51b9ea05 --- /dev/null +++ b/src/node/backstage/golib/main.go @@ -0,0 +1,38 @@ +package main + +import "C" + +import ( + "fmt" + "github.com/go-pay/gopay" + "github.com/go-pay/xlog" + "github.com/gin-gonic/gin" + "net/http" +) + +//export Func +func Func(input int){ + fmt.Println("I am Func, hello world,input ",input, " over") + xlog.Info("GoPay Version: ", gopay.Version) +} + +//export HttpRun +func HttpRun() { + xlog.Info("Hello world 2") + + router := gin.Default() + router.GET("/loop", func(c *gin.Context) { + i := 0 + for { + i++ + c.JSON(http.StatusOK, gin.H{ + "message": "Hello, World!", + "counter": i, + }) + break // 在这个例子中,我们只循环一次,然后退出 + } + }) + go router.Run(":8080") +} + +func main() {} diff --git a/tools/binary_strip.sh b/tools/binary_strip.sh new file mode 100755 index 00000000..ee53b907 --- /dev/null +++ b/tools/binary_strip.sh @@ -0,0 +1,4 @@ +#! /bin/bash + +cd ../bin +find . -type f -executable -exec strip {} \; From de3a402b09ba28f422456425545d2978a65ff214 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sat, 21 Sep 2024 16:44:09 +0800 Subject: [PATCH 10/16] Config init cnt is fixed. --- src/squick/plugin/config/class_module.cc | 7 +++---- src/squick/plugin/config/element_module.cc | 7 ++++++- src/squick/plugin/config/element_module.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/squick/plugin/config/class_module.cc b/src/squick/plugin/config/class_module.cc index 0843b004..83d6c6c9 100644 --- a/src/squick/plugin/config/class_module.cc +++ b/src/squick/plugin/config/class_module.cc @@ -17,9 +17,7 @@ ClassModule::ClassModule(IPluginManager *p) { #endif if (!this->mbBackup) { - // IThreadPoolModule *threadPoolModule = pm_->FindModule(); - // const int threadCount = threadPoolModule->GetThreadCount(); - for (int i = 0; i < 10; ++i) { + for (int i = 0; i < CONFIG_DATA_THREADS_CAN_BE_USED_CNT; ++i) { ThreadClassModule threadElement; threadElement.used = false; threadElement.classModule = new ClassModule(); @@ -64,6 +62,7 @@ bool ClassModule::Destroy() { return true; } +// Get a free class module for find IClassModule *ClassModule::GetThreadClassModule() { std::thread::id threadID = std::this_thread::get_id(); @@ -73,12 +72,12 @@ IClassModule *ClassModule::GetThreadClassModule() { return mThreadClasses[i].classModule; } } else { + // init for this thread mThreadClasses[i].used = true; mThreadClasses[i].threadID = threadID; return mThreadClasses[i].classModule; } } - return nullptr; } diff --git a/src/squick/plugin/config/element_module.cc b/src/squick/plugin/config/element_module.cc index 70785180..01952434 100644 --- a/src/squick/plugin/config/element_module.cc +++ b/src/squick/plugin/config/element_module.cc @@ -16,7 +16,7 @@ ElementModule::ElementModule(IPluginManager *p) { mbLoaded = false; if (!this->mbBackup) { - for (int i = 0; i < pm_->GetAppCPUCount(); ++i) { + for (int i = 0; i < CONFIG_DATA_THREADS_CAN_BE_USED_CNT; ++i) { ThreadElementModule threadElement; threadElement.used = false; threadElement.elementModule = new ElementModule(this); @@ -84,6 +84,11 @@ bool ElementModule::Destroy() { return true; } +bool ElementModule::Reload(int type) +{ + return true; +} + IElementModule *ElementModule::GetThreadElementModule() { std::thread::id threadID = std::this_thread::get_id(); diff --git a/src/squick/plugin/config/element_module.h b/src/squick/plugin/config/element_module.h index 935611f7..c546503e 100644 --- a/src/squick/plugin/config/element_module.h +++ b/src/squick/plugin/config/element_module.h @@ -19,7 +19,7 @@ #include class Class; - +#define CONFIG_DATA_THREADS_CAN_BE_USED_CNT 1 class ElementConfigInfo { public: ElementConfigInfo() { @@ -55,6 +55,7 @@ class ElementModule : public IElementModule, MapEx Date: Sat, 21 Sep 2024 16:44:40 +0800 Subject: [PATCH 11/16] Added hot attr in plugin xml --- config/plugin/backstage.xml | 2 +- config/plugin/db_proxy.xml | 10 +++++----- config/plugin/ds_mgr.xml | 2 +- config/plugin/game.xml | 2 +- config/plugin/master.xml | 2 +- config/plugin/player.xml | 2 +- config/plugin/proxy.xml | 2 +- config/plugin/web.xml | 2 +- config/plugin/world.xml | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/config/plugin/backstage.xml b/config/plugin/backstage.xml index e7b38a0f..532ee8a1 100644 --- a/config/plugin/backstage.xml +++ b/config/plugin/backstage.xml @@ -3,6 +3,6 @@ - + diff --git a/config/plugin/db_proxy.xml b/config/plugin/db_proxy.xml index 8372ad3e..5176ebba 100644 --- a/config/plugin/db_proxy.xml +++ b/config/plugin/db_proxy.xml @@ -3,10 +3,10 @@ - - - - - + + + + + \ No newline at end of file diff --git a/config/plugin/ds_mgr.xml b/config/plugin/ds_mgr.xml index e0d01c6a..4af26fad 100644 --- a/config/plugin/ds_mgr.xml +++ b/config/plugin/ds_mgr.xml @@ -3,6 +3,6 @@ - + \ No newline at end of file diff --git a/config/plugin/game.xml b/config/plugin/game.xml index c860891d..ecee73c0 100644 --- a/config/plugin/game.xml +++ b/config/plugin/game.xml @@ -3,6 +3,6 @@ - + \ No newline at end of file diff --git a/config/plugin/master.xml b/config/plugin/master.xml index 2874b45d..a45007e4 100644 --- a/config/plugin/master.xml +++ b/config/plugin/master.xml @@ -3,6 +3,6 @@ - + \ No newline at end of file diff --git a/config/plugin/player.xml b/config/plugin/player.xml index b6ac8108..ead2d9e9 100644 --- a/config/plugin/player.xml +++ b/config/plugin/player.xml @@ -9,6 +9,6 @@ - + diff --git a/config/plugin/proxy.xml b/config/plugin/proxy.xml index aacb0f4b..4fbb6305 100644 --- a/config/plugin/proxy.xml +++ b/config/plugin/proxy.xml @@ -5,6 +5,6 @@ - + \ No newline at end of file diff --git a/config/plugin/web.xml b/config/plugin/web.xml index ae4feadc..8fdc9cd2 100644 --- a/config/plugin/web.xml +++ b/config/plugin/web.xml @@ -3,7 +3,7 @@ - + diff --git a/config/plugin/world.xml b/config/plugin/world.xml index d079557f..452f6266 100644 --- a/config/plugin/world.xml +++ b/config/plugin/world.xml @@ -8,6 +8,6 @@ - + \ No newline at end of file From bed25774d744ee90ffea0240c3c36ca604ae0c02 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sat, 21 Sep 2024 16:44:53 +0800 Subject: [PATCH 12/16] Update CMakeLists.txt --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b5cb0793..1f5f6248 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,6 +161,7 @@ set(ProjectName "startup") file(GLOB soruces src/*.cc) file(GLOB headers src/*.h) file(GLOB_RECURSE proto ./src/proto/*.proto) +file(GLOB_RECURSE pycli ./src/pycli/*.py) file(GLOB_RECURSE lua ./src/lua/*.lua) file(GLOB_RECURSE plugin ./config//plugin/*.xml) file(GLOB_RECURSE config ./config/node/*.json) @@ -169,6 +170,7 @@ source_group_by_dir(proto) source_group_by_dir(lua) source_group_by_dir(plugin) source_group_by_dir(config) +source_group_by_dir(pycli) add_executable(${ProjectName} ${soruces} ${headers} ${proto} ${lua} ${plugin} ${config}) From 362cf7538daed1f3722d2cc424b661ecec9366a0 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sat, 21 Sep 2024 17:41:57 +0800 Subject: [PATCH 13/16] Remove useless excel header --- src/squick/core/i_property.h | 15 ------- src/squick/core/i_record.h | 16 -------- src/squick/core/property.cc | 28 ------------- src/squick/core/property.h | 15 ------- src/squick/core/property_manager.cc | 7 ---- src/squick/core/record.cc | 27 ------------ src/squick/core/record.h | 27 ------------ src/squick/plugin/config/class_module.cc | 48 +--------------------- src/squick/plugin/config/element_module.cc | 32 --------------- src/squick/plugin/world/scene_module.cc | 48 ++++++++-------------- src/squick/plugin/world/world_module.cc | 27 ------------ 11 files changed, 20 insertions(+), 270 deletions(-) diff --git a/src/squick/core/i_property.h b/src/squick/core/i_property.h index 3235bcbf..74b22d9d 100644 --- a/src/squick/core/i_property.h +++ b/src/squick/core/i_property.h @@ -29,21 +29,6 @@ class _SquickExport IProperty : public MemoryCounter { virtual const DATA_TYPE GetType() const = 0; virtual const bool GeUsed() const = 0; virtual const std::string &GetKey() const = 0; - virtual const bool GetSave() const = 0; - virtual const bool GetPublic() const = 0; - virtual const bool GetPrivate() const = 0; - virtual const bool GetCache() const = 0; - virtual const bool GetRef() const = 0; - virtual const bool GetForce() const = 0; - virtual const bool GetUpload() const = 0; - - virtual void SetSave(bool bSave) = 0; - virtual void SetPublic(bool bPublic) = 0; - virtual void SetPrivate(bool bPrivate) = 0; - virtual void SetCache(bool bCache) = 0; - virtual void SetRef(bool bRef) = 0; - virtual void SetForce(bool bRef) = 0; - virtual void SetUpload(bool bUpload) = 0; virtual INT64 GetInt() const = 0; virtual int GetInt32() const = 0; diff --git a/src/squick/core/i_record.h b/src/squick/core/i_record.h index 076fadcc..8c3d7985 100644 --- a/src/squick/core/i_record.h +++ b/src/squick/core/i_record.h @@ -144,26 +144,10 @@ class _SquickExport IRecord : public MemoryCounter { virtual bool Clear() = 0; virtual void AddRecordHook(const RECORD_EVENT_FUNCTOR_PTR &cb) = 0; - - virtual const bool GetSave() = 0; - virtual const bool GetPublic() = 0; - virtual const bool GetPrivate() = 0; - virtual const bool GetCache() = 0; - virtual const bool GetRef() = 0; - virtual const bool GetForce() = 0; - virtual const bool GetUpload() = 0; virtual const std::string &GetName() const = 0; virtual std::shared_ptr GetStartData() const = 0; virtual const std::shared_ptr GetTag() const = 0; - - virtual void SetSave(const bool bSave) = 0; - virtual void SetCache(const bool bCache) = 0; - virtual void SetRef(const bool bRef) = 0; - virtual void SetForce(const bool bForce) = 0; - virtual void SetUpload(const bool bUpload) = 0; - virtual void SetPublic(const bool bPublic) = 0; - virtual void SetPrivate(const bool bPrivate) = 0; virtual void SetName(const std::string &name) = 0; virtual const TRECORDVEC &GetRecordVec() const = 0; diff --git a/src/squick/core/property.cc b/src/squick/core/property.cc index f134cdfc..06056489 100644 --- a/src/squick/core/property.cc +++ b/src/squick/core/property.cc @@ -80,34 +80,6 @@ const SquickData &Property::GetValue() const { const std::string &Property::GetKey() const { return msPropertyName; } -const bool Property::GetSave() const { return mbSave; } - -const bool Property::GetPublic() const { return mbPublic; } - -const bool Property::GetPrivate() const { return mbPrivate; } - -const bool Property::GetCache() const { return mbCache; } - -const bool Property::GetRef() const { return mbRef; } - -const bool Property::GetForce() const { return mbForce; } - -const bool Property::GetUpload() const { return mbUpload; } - -void Property::SetSave(bool bSave) { mbSave = bSave; } - -void Property::SetPublic(bool bPublic) { mbPublic = bPublic; } - -void Property::SetPrivate(bool bPrivate) { mbPrivate = bPrivate; } - -void Property::SetCache(bool bCache) { mbCache = bCache; } - -void Property::SetRef(bool bRef) { mbRef = bRef; } - -void Property::SetForce(bool bRef) { mbForce = bRef; } - -void Property::SetUpload(bool bUpload) { mbUpload = bUpload; } - INT64 Property::GetInt() const { if (!mxData) { return 0; diff --git a/src/squick/core/property.h b/src/squick/core/property.h index fe9ec03c..7507a569 100644 --- a/src/squick/core/property.h +++ b/src/squick/core/property.h @@ -31,21 +31,6 @@ class _SquickExport Property : public IProperty { virtual const DATA_TYPE GetType() const; virtual const bool GeUsed() const; virtual const std::string &GetKey() const; - virtual const bool GetSave() const; - virtual const bool GetPublic() const; - virtual const bool GetPrivate() const; - virtual const bool GetCache() const; - virtual const bool GetRef() const; - virtual const bool GetForce() const; - virtual const bool GetUpload() const; - - virtual void SetSave(bool bSave); - virtual void SetPublic(bool bPublic); - virtual void SetPrivate(bool bPrivate); - virtual void SetCache(bool bCache); - virtual void SetRef(bool bRef); - virtual void SetForce(bool bRef); - virtual void SetUpload(bool bUpload); virtual INT64 GetInt() const; virtual int GetInt32() const; diff --git a/src/squick/core/property_manager.cc b/src/squick/core/property_manager.cc index 81a36d2e..fe31f6b9 100644 --- a/src/squick/core/property_manager.cc +++ b/src/squick/core/property_manager.cc @@ -21,13 +21,6 @@ std::shared_ptr PropertyManager::AddProperty(const Guid &self, std::s if (!pOldProperty) { std::shared_ptr pNewProperty(new Property(self, propertyName, pProperty->GetType())); - pNewProperty->SetPublic(pProperty->GetPublic()); - pNewProperty->SetPrivate(pProperty->GetPrivate()); - pNewProperty->SetSave(pProperty->GetSave()); - pNewProperty->SetCache(pProperty->GetCache()); - pNewProperty->SetRef(pProperty->GetRef()); - pNewProperty->SetUpload(pProperty->GetUpload()); - this->AddElement(propertyName, pNewProperty); } diff --git a/src/squick/core/record.cc b/src/squick/core/record.cc index e1c49600..a6617841 100644 --- a/src/squick/core/record.cc +++ b/src/squick/core/record.cc @@ -1134,38 +1134,11 @@ bool Record::Clear() { void Record::AddRecordHook(const RECORD_EVENT_FUNCTOR_PTR &cb) { mtRecordCallback.push_back(cb); } -const bool Record::GetSave() { return mbSave; } - -const bool Record::GetCache() { return mbCache; } - -const bool Record::GetRef() { return mbRef; } - -const bool Record::GetForce() { return mbForce; } - -const bool Record::GetUpload() { return mbUpload; } - -const bool Record::GetPublic() { return mbPublic; } - -const bool Record::GetPrivate() { return mbPrivate; } int Record::GetPos(int row, int col) const { return row * mVarRecordType->GetCount() + col; } const std::string &Record::GetName() const { return mstrRecordName; } -void Record::SetSave(const bool bSave) { mbSave = bSave; } - -void Record::SetCache(const bool bCache) { mbCache = bCache; } - -void Record::SetRef(const bool bRef) { mbRef = bRef; } - -void Record::SetForce(const bool bForce) { mbForce = bForce; } - -void Record::SetUpload(const bool bUpload) { mbUpload = bUpload; } - -void Record::SetPublic(const bool bPublic) { mbPublic = bPublic; } - -void Record::SetPrivate(const bool bPrivate) { mbPrivate = bPrivate; } - void Record::SetName(const std::string &name) { mstrRecordName = name; } std::shared_ptr Record::GetStartData() const { diff --git a/src/squick/core/record.h b/src/squick/core/record.h index 9f2aa41f..45d68d4b 100644 --- a/src/squick/core/record.h +++ b/src/squick/core/record.h @@ -109,36 +109,9 @@ class _SquickExport Record : public IRecord { virtual void AddRecordHook(const RECORD_EVENT_FUNCTOR_PTR &cb); - virtual const bool GetSave(); - - virtual const bool GetCache(); - - virtual const bool GetRef(); - - virtual const bool GetForce(); - - virtual const bool GetUpload(); - - virtual const bool GetPublic(); - - virtual const bool GetPrivate(); virtual const std::string &GetName() const; - virtual void SetSave(const bool bSave); - - virtual void SetCache(const bool bCache); - - virtual void SetRef(const bool bRef); - - virtual void SetForce(const bool bForce); - - virtual void SetUpload(const bool bUpload); - - virtual void SetPublic(const bool bPublic); - - virtual void SetPrivate(const bool bPrivate); - virtual void SetName(const std::string &name); virtual std::shared_ptr GetStartData() const; diff --git a/src/squick/plugin/config/class_module.cc b/src/squick/plugin/config/class_module.cc index 83d6c6c9..96a695c6 100644 --- a/src/squick/plugin/config/class_module.cc +++ b/src/squick/plugin/config/class_module.cc @@ -116,21 +116,6 @@ bool ClassModule::AddProperties(rapidxml::xml_node<> *pPropertyRootNode, std::sh } const char *pstrType = pPropertyNode->first_attribute("Type")->value(); - const char *pstrPublic = pPropertyNode->first_attribute("Public")->value(); - const char *pstrPrivate = pPropertyNode->first_attribute("Private")->value(); - const char *pstrSave = pPropertyNode->first_attribute("Save")->value(); - const char *pstrCache = pPropertyNode->first_attribute("Cache")->value(); - const char *pstrRef = pPropertyNode->first_attribute("Ref")->value(); - const char *pstrForce = pPropertyNode->first_attribute("Force")->value(); - const char *pstrUpload = pPropertyNode->first_attribute("Upload")->value(); - - bool bPublic = lexical_cast(pstrPublic); - bool bPrivate = lexical_cast(pstrPrivate); - bool bSave = lexical_cast(pstrSave); - bool bCache = lexical_cast(pstrCache); - bool bRef = lexical_cast(pstrRef); - bool bForce = lexical_cast(pstrForce); - bool bUpload = lexical_cast(pstrUpload); SquickData varProperty; if (TDATA_UNKNOWN == ComputerType(pstrType, varProperty)) { @@ -142,13 +127,6 @@ bool ClassModule::AddProperties(rapidxml::xml_node<> *pPropertyRootNode, std::sh // printf( " Property:%s[%s]\n", propertyName, pstrType ); std::shared_ptr xProperty = pClass->GetPropertyManager()->AddProperty(Guid(), propertyName, varProperty.GetType()); - xProperty->SetPublic(bPublic); - xProperty->SetPrivate(bPrivate); - xProperty->SetSave(bSave); - xProperty->SetCache(bCache); - xProperty->SetRef(bRef); - xProperty->SetForce(bForce); - xProperty->SetUpload(bUpload); } } @@ -170,28 +148,13 @@ bool ClassModule::AddRecords(rapidxml::xml_node<> *pRecordRootNode, std::shared_ const char *pstrRow = pRecordNode->first_attribute("Row")->value(); const char *pstrCol = pRecordNode->first_attribute("Col")->value(); - - const char *pstrPublic = pRecordNode->first_attribute("Public")->value(); - const char *pstrPrivate = pRecordNode->first_attribute("Private")->value(); - const char *pstrSave = pRecordNode->first_attribute("Save")->value(); - const char *pstrCache = pRecordNode->first_attribute("Cache")->value(); - const char *pstrRef = pRecordNode->first_attribute("Ref")->value(); - const char *pstrForce = pRecordNode->first_attribute("Force")->value(); - const char *pstrUpload = pRecordNode->first_attribute("Upload")->value(); + std::string strView; if (pRecordNode->first_attribute("View") != NULL) { strView = pRecordNode->first_attribute("View")->value(); } - bool bPublic = lexical_cast(pstrPublic); - bool bPrivate = lexical_cast(pstrPrivate); - bool bSave = lexical_cast(pstrSave); - bool bCache = lexical_cast(pstrCache); - bool bRef = lexical_cast(pstrCache); - bool bForce = lexical_cast(pstrCache); - bool bUpload = lexical_cast(pstrUpload); - std::shared_ptr recordVar(new DataList()); std::shared_ptr recordTag(new DataList()); @@ -215,14 +178,7 @@ bool ClassModule::AddRecords(rapidxml::xml_node<> *pRecordRootNode, std::shared_ } std::shared_ptr xRecord = pClass->GetRecordManager()->AddRecord(Guid(), pstrRecordName, recordVar, recordTag, atoi(pstrRow)); - - xRecord->SetPublic(bPublic); - xRecord->SetPrivate(bPrivate); - xRecord->SetSave(bSave); - xRecord->SetCache(bCache); - xRecord->SetRef(bRef); - xRecord->SetForce(bForce); - xRecord->SetUpload(bUpload); + } } diff --git a/src/squick/plugin/config/element_module.cc b/src/squick/plugin/config/element_module.cc index 01952434..d9ef7946 100644 --- a/src/squick/plugin/config/element_module.cc +++ b/src/squick/plugin/config/element_module.cc @@ -167,30 +167,6 @@ bool ElementModule::Load() { } bool ElementModule::CheckRef() { - std::shared_ptr pLogicClass = m_class_->First(); - while (pLogicClass) { - std::shared_ptr pClassPropertyManager = pLogicClass->GetPropertyManager(); - if (pClassPropertyManager) { - std::shared_ptr pProperty = pClassPropertyManager->First(); - while (pProperty) { - // if one property is ref,check every config - if (pProperty->GetRef()) { - const std::vector &strIdList = pLogicClass->GetIDList(); - for (int i = 0; i < strIdList.size(); ++i) { - const std::string &strId = strIdList[i]; - - const std::string &strRefValue = this->GetPropertyString(strId, pProperty->GetKey()); - if (!strRefValue.empty() && !this->GetElement(strRefValue)) { - LOG_FATAL("Check ref<%v> failed, class_name<%v> id<%v>", strRefValue, pLogicClass->GetClassName(), strId); - } - } - } - pProperty = pClassPropertyManager->Next(); - } - } - ////////////////////////////////////////////////////////////////////////// - pLogicClass = m_class_->Next(); - } return false; } @@ -243,14 +219,6 @@ bool ElementModule::Load(rapidxml::xml_node<> *attrNode, std::shared_ptr std::shared_ptr xRecord = pElementRecordManager->AddRecord(Guid(), pRecord->GetName(), pRecord->GetStartData(), pRecord->GetTag(), pRecord->GetRows()); - xRecord->SetPublic(pRecord->GetPublic()); - xRecord->SetPrivate(pRecord->GetPrivate()); - xRecord->SetSave(pRecord->GetSave()); - xRecord->SetCache(pRecord->GetCache()); - xRecord->SetRef(pRecord->GetRef()); - xRecord->SetForce(pRecord->GetForce()); - xRecord->SetUpload(pRecord->GetUpload()); - pRecord = pClassRecordManager->Next(); } } diff --git a/src/squick/plugin/world/scene_module.cc b/src/squick/plugin/world/scene_module.cc index 021d8f3f..f38449a7 100644 --- a/src/squick/plugin/world/scene_module.cc +++ b/src/squick/plugin/world/scene_module.cc @@ -76,13 +76,6 @@ int SceneModule::RequestGroupScene(const int sceneID) { std::shared_ptr xProperty = pPropertyManager->AddProperty(ident, pStaticConfigPropertyInfo->GetKey(), pStaticConfigPropertyInfo->GetType()); - xProperty->SetPublic(pStaticConfigPropertyInfo->GetPublic()); - xProperty->SetPrivate(pStaticConfigPropertyInfo->GetPrivate()); - xProperty->SetSave(pStaticConfigPropertyInfo->GetSave()); - xProperty->SetCache(pStaticConfigPropertyInfo->GetCache()); - xProperty->SetRef(pStaticConfigPropertyInfo->GetRef()); - xProperty->SetUpload(pStaticConfigPropertyInfo->GetUpload()); - PROPERTY_EVENT_FUNCTOR functor = std::bind(&SceneModule::OnScenePropertyCommonEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5); PROPERTY_EVENT_FUNCTOR_PTR functorPtr(new PROPERTY_EVENT_FUNCTOR(functor)); @@ -96,11 +89,6 @@ int SceneModule::RequestGroupScene(const int sceneID) { std::shared_ptr xRecord = pRecordManager->AddRecord(ident, pConfigRecordInfo->GetName(), pConfigRecordInfo->GetStartData(), pConfigRecordInfo->GetTag(), pConfigRecordInfo->GetRows()); - xRecord->SetPublic(pConfigRecordInfo->GetPublic()); - xRecord->SetPrivate(pConfigRecordInfo->GetPrivate()); - xRecord->SetSave(pConfigRecordInfo->GetSave()); - xRecord->SetCache(pConfigRecordInfo->GetCache()); - xRecord->SetUpload(pConfigRecordInfo->GetUpload()); RECORD_EVENT_FUNCTOR functor = std::bind(&SceneModule::OnSceneRecordCommonEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4); @@ -1250,27 +1238,27 @@ int SceneModule::GetBroadCastObject(const Guid &self, const std::string &propert if (bTable) { // upload property can not board to itself // if (pRecord->GetUpload()) - { - if (pRecord->GetPublic()) { - m_pCellModule->GetCellObjectList(nObjectContainerID, nObjectGroupID, position, valueObject, true, self); - } - - if (pRecord->GetPrivate()) { - valueObject.Add(self); - } - } + // { + // if (pRecord->GetPublic()) { + // m_pCellModule->GetCellObjectList(nObjectContainerID, nObjectGroupID, position, valueObject, true, self); + // } + + // if (pRecord->GetPrivate()) { + // valueObject.Add(self); + // } + // } } else { // upload property can not board to itself // if (pProperty->GetUpload()) - { - if (pProperty->GetPublic()) { - m_pCellModule->GetCellObjectList(nObjectContainerID, nObjectGroupID, position, valueObject, true, self); - } - - if (pProperty->GetPrivate()) { - valueObject.Add(self); - } - } + // { + // if (pProperty->GetPublic()) { + // m_pCellModule->GetCellObjectList(nObjectContainerID, nObjectGroupID, position, valueObject, true, self); + // } + + // if (pProperty->GetPrivate()) { + // valueObject.Add(self); + // } + // } } return valueObject.GetCount(); diff --git a/src/squick/plugin/world/world_module.cc b/src/squick/plugin/world/world_module.cc index 925dc7dd..e605254f 100644 --- a/src/squick/plugin/world/world_module.cc +++ b/src/squick/plugin/world/world_module.cc @@ -125,13 +125,6 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s std::shared_ptr xProperty = pPropertyManager->AddProperty(ident, pStaticConfigPropertyInfo->GetKey(), pStaticConfigPropertyInfo->GetType()); - xProperty->SetPublic(pStaticConfigPropertyInfo->GetPublic()); - xProperty->SetPrivate(pStaticConfigPropertyInfo->GetPrivate()); - xProperty->SetSave(pStaticConfigPropertyInfo->GetSave()); - xProperty->SetCache(pStaticConfigPropertyInfo->GetCache()); - xProperty->SetRef(pStaticConfigPropertyInfo->GetRef()); - xProperty->SetUpload(pStaticConfigPropertyInfo->GetUpload()); - // pObject->AddPropertyCallBack(pStaticConfigPropertyInfo->GetKey(), this, &WorldModule::OnPropertyCommonEvent); @@ -142,13 +135,6 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s while (pConfigRecordInfo) { std::shared_ptr xRecord = pRecordManager->AddRecord(ident, pConfigRecordInfo->GetName(), pConfigRecordInfo->GetStartData(), pConfigRecordInfo->GetTag(), pConfigRecordInfo->GetRows()); - - xRecord->SetPublic(pConfigRecordInfo->GetPublic()); - xRecord->SetPrivate(pConfigRecordInfo->GetPrivate()); - xRecord->SetSave(pConfigRecordInfo->GetSave()); - xRecord->SetCache(pConfigRecordInfo->GetCache()); - xRecord->SetUpload(pConfigRecordInfo->GetUpload()); - // pObject->AddRecordCallBack(pConfigRecordInfo->GetName(), this, &WorldModule::OnRecordCommonEvent); @@ -295,13 +281,6 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s std::shared_ptr xProperty = pPropertyManager->AddProperty(ident, pStaticConfigPropertyInfo->GetKey(), pStaticConfigPropertyInfo->GetType()); - xProperty->SetPublic(pStaticConfigPropertyInfo->GetPublic()); - xProperty->SetPrivate(pStaticConfigPropertyInfo->GetPrivate()); - xProperty->SetSave(pStaticConfigPropertyInfo->GetSave()); - xProperty->SetCache(pStaticConfigPropertyInfo->GetCache()); - xProperty->SetRef(pStaticConfigPropertyInfo->GetRef()); - xProperty->SetUpload(pStaticConfigPropertyInfo->GetUpload()); - pObject->AddPropertyCallBack(pStaticConfigPropertyInfo->GetKey(), this, &WorldModule::OnPropertyCommonEvent); pStaticConfigPropertyInfo = pStaticClassPropertyManager->Next(); @@ -312,12 +291,6 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s std::shared_ptr xRecord = pRecordManager->AddRecord(ident, pConfigRecordInfo->GetName(), pConfigRecordInfo->GetStartData(), pConfigRecordInfo->GetTag(), pConfigRecordInfo->GetRows()); - xRecord->SetPublic(pConfigRecordInfo->GetPublic()); - xRecord->SetPrivate(pConfigRecordInfo->GetPrivate()); - xRecord->SetSave(pConfigRecordInfo->GetSave()); - xRecord->SetCache(pConfigRecordInfo->GetCache()); - xRecord->SetUpload(pConfigRecordInfo->GetUpload()); - pObject->AddRecordCallBack(pConfigRecordInfo->GetName(), this, &WorldModule::OnRecordCommonEvent); pConfigRecordInfo = pStaticClassRecordManager->Next(); From 324a06080c81c6274ce711f022c37c355295e7d5 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sat, 21 Sep 2024 18:24:40 +0800 Subject: [PATCH 14/16] Remove useless excel header --- resource/excel/Group.xlsx | Bin 9040 -> 9236 bytes resource/excel/Player.xlsx | Bin 9708 -> 9666 bytes resource/excel/Scene.xlsx | Bin 11301 -> 11118 bytes resource/excel/common/IObject.xlsx | Bin 9964 -> 9848 bytes resource/excel/example/Property.xlsx | Bin 9389 -> 9580 bytes resource/excel/example/Record.xlsx | Bin 10899 -> 10507 bytes src/squick/plugin/config/class_module.cc | 4 +- src/tools/sqkctl/excel/config_generator.cc | 4 - src/tools/sqkctl/excel/config_generator.h | 11 +- src/tools/sqkctl/excel/java_generator.h | 108 ----------- .../sqkctl/excel/logic_class_generator.h | 2 +- src/tools/sqkctl/excel/pb_generator.h | 11 -- src/tools/sqkctl/excel/sql_generator.h | 124 ------------- src/tools/sqkctl/excel/ts_generator.h | 167 ------------------ 14 files changed, 7 insertions(+), 424 deletions(-) delete mode 100644 src/tools/sqkctl/excel/java_generator.h delete mode 100644 src/tools/sqkctl/excel/pb_generator.h delete mode 100644 src/tools/sqkctl/excel/sql_generator.h delete mode 100644 src/tools/sqkctl/excel/ts_generator.h diff --git a/resource/excel/Group.xlsx b/resource/excel/Group.xlsx index 70021905ea9eb4875f0fb7a1b993e43b91577c1b..9f97bf0b90d25974fa93d275a0c0a7295ac6d8fa 100644 GIT binary patch literal 9236 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 literal 9040 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 he%Af9Yw`c3`DG#~+TOnA?F{{oO7muvt4 diff --git a/resource/excel/Player.xlsx b/resource/excel/Player.xlsx index 240054038e14c131677ae228cbeaf1c1005dbd2f..3ffe3c4f538ba8d1eafb4df2018b0d7e93133289 100644 GIT binary patch literal 9666 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 NfKHe)?$ZAF_kVM-L398B literal 9708 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 diff --git a/resource/excel/Scene.xlsx b/resource/excel/Scene.xlsx index ff8ac005862e33edd26f8c1a5d94da127a7c0913..abbb6b4d880da544c758d81bee35c79e3e675b88 100644 GIT binary patch literal 11118 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

4K5D#X*bG6u(hcKU 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 B6{-LL literal 11301 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 me@FjS3aqRpAIr!EX5G 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 diff --git a/resource/excel/example/Property.xlsx b/resource/excel/example/Property.xlsx index cb63180d2742135d4ee369f024038bb32cd688c8..14689407cac817819bc365ae80f5e5ad455dd435 100644 GIT binary patch literal 9580 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 diff --git a/resource/excel/example/Record.xlsx b/resource/excel/example/Record.xlsx index 4d7e1e6af8e1ad670879117bd51f018bba8769b5..96413e9bc0da36955dd8ab5e28b220a9b8a9e69f 100644 GIT binary patch literal 10507 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 literal 10899 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 #include #include -ClassModule::ClassModule() { mConfigFileName = "config/struct/logic_class.xml"; } +ClassModule::ClassModule() { mConfigFileName = "config/struct/Root.xml"; } ClassModule::ClassModule(IPluginManager *p) { pm_ = p; - mConfigFileName = "config/struct/logic_class.xml"; + mConfigFileName = "config/struct/Root.xml"; #ifdef DEBUG std::cout << "Using [" << pm_->GetWorkPath() << "/" + mConfigFileName << "]" << std::endl; diff --git a/src/tools/sqkctl/excel/config_generator.cc b/src/tools/sqkctl/excel/config_generator.cc index b6b06598..f046c73a 100644 --- a/src/tools/sqkctl/excel/config_generator.cc +++ b/src/tools/sqkctl/excel/config_generator.cc @@ -15,12 +15,8 @@ ConfigGenerator::ConfigGenerator(const std::string &excelPath, const std::string mxGenerators.push_back(new CPPGenerator(excelPath, outPath)); mxGenerators.push_back(new CSGenerator(excelPath, outPath)); mxGenerators.push_back(new IniGenerator(excelPath, outPath)); - mxGenerators.push_back(new JAVAGenerator(excelPath, outPath)); mxGenerators.push_back(new LogicClassGenerator(excelPath, outPath)); - mxGenerators.push_back(new PBGenerator(excelPath, outPath)); - mxGenerators.push_back(new SQLGenerator(excelPath, outPath)); mxGenerators.push_back(new StructGenerator(excelPath, outPath)); - mxGenerators.push_back(new TSGenerator(excelPath, outPath)); mxGenerators.push_back(new LuaGenerator(excelPath, outPath)); strExcelIniPath = excelPath; diff --git a/src/tools/sqkctl/excel/config_generator.h b/src/tools/sqkctl/excel/config_generator.h index d4396c38..36c3ab8c 100644 --- a/src/tools/sqkctl/excel/config_generator.h +++ b/src/tools/sqkctl/excel/config_generator.h @@ -3,15 +3,11 @@ #include "cpp_generator.h" #include "cs_generator.h" #include "ini_generator.h" -#include "java_generator.h" #include "logic_class_generator.h" #include "lua_generator.h" #include "mini_excel_reader.h" -#include "pb_generator.h" -#include "sql_generator.h" #include "struct_generator.h" #include "third_party/common/lexical_cast.hpp" -#include "ts_generator.h" #include namespace sqkctl { @@ -50,9 +46,10 @@ class ConfigGenerator { private: bool bConvertIntoUTF8 = false; - const int nPropertyHeight = 10; // property line - const int nRecordHeight = 13; // record line - const int nRecordDescHeight = 9; // record line + // Excel base header attr line define + const int nPropertyHeight = 3; // property line + const int nRecordHeight = 6; // record line + const int nRecordDescHeight = 2; // record line std::string outPath; std::string strExcelIniPath; // = "../excel/"; diff --git a/src/tools/sqkctl/excel/java_generator.h b/src/tools/sqkctl/excel/java_generator.h deleted file mode 100644 index df5b8b2a..00000000 --- a/src/tools/sqkctl/excel/java_generator.h +++ /dev/null @@ -1,108 +0,0 @@ -#pragma once - -#include "i_generator.h" -namespace sqkctl { -class JAVAGenerator : public IGenerator { - public: - JAVAGenerator(const std::string &excelPath, const std::string &outPath) { SetPath(excelPath, outPath); } - - virtual bool Generate(const std::map &classData) override { - - FILE *javaWriter = fopen((outPath + "/excel/Excel.java").c_str(), "w"); - - std::string strFileHead = "// -------------------------------------------------------------------------\n"; - strFileHead = strFileHead + "// @FileName : Excel.java\n" + "// @Author : I0gan\n" + - "// @Module : Excel\n" + "// -------------------------------------------------------------------------\n\n" + - "package Excel;\n"; - - fwrite(strFileHead.c_str(), strFileHead.length(), 1, javaWriter); - ///////////////////////////////////////////////////// - - ClassData *pBaseObject = classData.at("IObject"); - for (std::map::const_iterator it = classData.begin(); it != classData.end(); ++it) { - const std::string &className = it->first; - ClassData *pClassDta = it->second; - - if (pClassDta->beIncluded || pClassDta->beParted || className == "Include") { - continue; - } - - // cs - std::string strPropertyInfo; - - strPropertyInfo += "\tpublic class " + className + "\n\t{\n"; - strPropertyInfo += "\t\t//Class name\n\t"; - strPropertyInfo += "\tpublic static final String ThisName = \"" + className + "\";\n"; - - if (className != "IObject") { - // add base class properties - strPropertyInfo += "\t\t// IObject\n"; - - for (std::map::iterator itProperty = pBaseObject->xStructData.xPropertyList.begin(); - itProperty != pBaseObject->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *pClassProperty = itProperty->second; - - strPropertyInfo += "\t\tpublic static final String " + propertyName + " = \"" + propertyName + "\";"; - strPropertyInfo += "// " + pClassProperty->descList["Type"] + "\n"; - } - } - - strPropertyInfo += "\t\t// Property\n"; - for (std::map::iterator itProperty = pClassDta->xStructData.xPropertyList.begin(); - itProperty != pClassDta->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *pClassProperty = itProperty->second; - - strPropertyInfo += "\t\tpublic static final String " + propertyName + " = \"" + propertyName + "\";"; - strPropertyInfo += "// " + pClassProperty->descList["Type"] + "\n"; - } - - fwrite(strPropertyInfo.c_str(), strPropertyInfo.length(), 1, javaWriter); - - // record - std::string strRecordInfo = ""; - strRecordInfo += "\t\t// Record\n"; - - for (std::map::iterator itRecord = pClassDta->xStructData.xRecordList.begin(); - itRecord != pClassDta->xStructData.xRecordList.end(); ++itRecord) { - const std::string &recordName = itRecord->first; - ClassRecord *pClassRecord = itRecord->second; - - std::cout << "save for java ---> " << className << "::" << recordName << std::endl; - - strRecordInfo += "\t\tpublic class " + recordName + "\n\t\t{\n"; - strRecordInfo += "\t\t\t//Class name\n\t"; - strRecordInfo += "\t\tpublic static final String ThisName = \"" + recordName + "\";\n"; - - // col - for (int i = 0; i < pClassRecord->colList.size(); ++i) { - for (std::map::iterator itCol = pClassRecord->colList.begin(); - itCol != pClassRecord->colList.end(); ++itCol) { - const std::string &colTag = itCol->first; - ClassRecord::RecordColDesc *pRecordColDesc = itCol->second; - - if (pRecordColDesc->index == i) { - strRecordInfo += - "\t\t\tpublic static final int " + colTag + " = " + std::to_string(pRecordColDesc->index) + ";//" + pRecordColDesc->type + "\n"; - } - } - } - - strRecordInfo += "\n\t\t}\n"; - } - fwrite(strRecordInfo.c_str(), strRecordInfo.length(), 1, javaWriter); - - std::string strHppEnumInfo = ""; - - std::string strClassEnd; - strClassEnd += "\n\t}\n"; - - fwrite(strClassEnd.c_str(), strClassEnd.length(), 1, javaWriter); - } - fclose(javaWriter); - - return false; - } -}; -} // namespace sqkctl diff --git a/src/tools/sqkctl/excel/logic_class_generator.h b/src/tools/sqkctl/excel/logic_class_generator.h index 7ae87842..95c0f52e 100644 --- a/src/tools/sqkctl/excel/logic_class_generator.h +++ b/src/tools/sqkctl/excel/logic_class_generator.h @@ -8,7 +8,7 @@ class LogicClassGenerator : public IGenerator { LogicClassGenerator(const std::string &excelPath, const std::string &outPath) { SetPath(excelPath, outPath); } virtual bool Generate(const std::map &classData) override { - std::string fileName = strXMLStructPath + "logic_class.xml"; + std::string fileName = strXMLStructPath + "Root.xml"; FILE *iniWriter = fopen(fileName.c_str(), "w"); diff --git a/src/tools/sqkctl/excel/pb_generator.h b/src/tools/sqkctl/excel/pb_generator.h deleted file mode 100644 index 09afe91b..00000000 --- a/src/tools/sqkctl/excel/pb_generator.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "i_generator.h" -namespace sqkctl { -class PBGenerator : public IGenerator { - public: - PBGenerator(const std::string &excelPath, const std::string &outPath) { SetPath(excelPath, outPath); } - - virtual bool Generate(const std::map &classData) override { return false; } -}; -} // namespace sqkctl diff --git a/src/tools/sqkctl/excel/sql_generator.h b/src/tools/sqkctl/excel/sql_generator.h deleted file mode 100644 index a7676df5..00000000 --- a/src/tools/sqkctl/excel/sql_generator.h +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once - -#include "i_generator.h" -namespace sqkctl { -class SQLGenerator : public IGenerator { - - public: - SQLGenerator(const std::string &excelPath, const std::string &outPath) { SetPath(excelPath, outPath); } - - virtual bool Generate(const std::map &classData) override { - // 1 class.sql - std::string fileName = outPath + "/excel/server.sql"; - - FILE *iniWriter = fopen(fileName.c_str(), "w"); - - std::string strElementData; - for (std::map::const_iterator it = classData.begin(); it != classData.end(); ++it) { - const std::string &className = it->first; - ClassData *pClassDta = it->second; - - if (pClassDta->beIncluded || pClassDta->beParted || className == "Include") { - continue; - } - - strElementData += "CREATE TABLE IF NOT EXISTS " + pClassDta->xStructData.className + " ("; - strElementData += " `ID` varchar(128) NOT NULL,"; - strElementData += " PRIMARY KEY (`ID`)"; - strElementData += " ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \n"; - } - - // 2 fields - // ALTER TABLE `Buff` ADD `EffectType` bigint(11) DEFAULT '0' COMMENT '影响属性类型(效果类型) 生命,法力(可组合,叠加)'; - // 2.1) property - for (std::map::const_iterator it = classData.begin(); it != classData.end(); ++it) { - const std::string &className = it->first; - ClassData *pClassDta = it->second; - - for (std::map::iterator itProperty = pClassDta->xStructData.xPropertyList.begin(); - itProperty != pClassDta->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *xPropertyData = itProperty->second; - - std::string strType; - std::string strSave; - std::string strCache; - std::string strDesc; - for (std::map::iterator itDesc = xPropertyData->descList.begin(); itDesc != xPropertyData->descList.end(); ++itDesc) { - const std::string &strKey = itDesc->first; - const std::string &value = itDesc->second; - if (strKey == "Type") { - strType = value; - } else if (strKey == "Save") { - strSave = value; - } else if (strKey == "Cache") { - strCache = value; - } else if (strKey == "Desc") { - strDesc = value; - } - } - - if (strSave == "1" || strCache == "1") { - std::string strAlter = "\nALTER TABLE `" + className + "` ADD `" + propertyName + "`"; - // ALTER TABLE `Buff` ADD `EffectType` bigint(11) DEFAULT '0' COMMENT '影响属性类型(效果类型) 生命,法力(可组合,叠加)'; - if (strType == "int") { - strAlter += " bigint(11) DEFAULT '0'"; - } else if (strType == "string") { - strAlter += " text COLLATE utf8mb4_unicode_ci DEFAULT ''"; - } else if (strType == "float") { - strAlter += " double DEFAULT '0.0'"; - } else if (strType == "object") { - strAlter += " varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT ''"; - } else if (strType == "vector2") { - strAlter += " varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT ''"; - } else if (strType == "vector3") { - strAlter += " varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT ''"; - } - - strAlter += " COMMENT '" + strDesc + "';"; - - strElementData += strAlter; - } - } - - // 2.2) record - for (std::map::iterator itRecord = pClassDta->xStructData.xRecordList.begin(); - itRecord != pClassDta->xStructData.xRecordList.end(); ++itRecord) { - const std::string &recordName = itRecord->first; - ClassRecord *xRecordData = itRecord->second; - - std::string strType; - std::string strSave; - std::string strCache; - std::string strDesc; - for (std::map::iterator itDesc = xRecordData->descList.begin(); itDesc != xRecordData->descList.end(); ++itDesc) { - const std::string &strKey = itDesc->first; - const std::string &value = itDesc->second; - if (strKey == "Type") { - strType = value; - } else if (strKey == "Save") { - strSave = value; - } else if (strKey == "Cache") { - strCache = value; - } else if (strKey == "Desc") { - strDesc = value; - } - } - - if (strSave == "1" || strCache == "1") { - std::string strAlter = "\nALTER TABLE `" + className + "` ADD `" + recordName + "`"; - strAlter += " text COLLATE utf8mb4_unicode_ci DEFAULT ''"; - strAlter += " COMMENT '" + strDesc + "';"; - - strElementData += strAlter; - } - } - } - - fwrite(strElementData.c_str(), strElementData.length(), 1, iniWriter); - fclose(iniWriter); - - return true; - } -}; -} // namespace sqkctl diff --git a/src/tools/sqkctl/excel/ts_generator.h b/src/tools/sqkctl/excel/ts_generator.h deleted file mode 100644 index 405154b5..00000000 --- a/src/tools/sqkctl/excel/ts_generator.h +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once - -#include "i_generator.h" -namespace sqkctl { -class TSGenerator : public IGenerator { - public: - TSGenerator(const std::string &excelPath, const std::string &outPath) { SetPath(excelPath, outPath); } - - virtual bool Generate(const std::map &classData) override { - - FILE *csWriter = fopen((outPath + "/excel/excel.ts").c_str(), "w"); - - std::string strFileHead = "// -------------------------------------------------------------------------\n"; - strFileHead = strFileHead + "// @FileName : excel.ts\n" + "// @Author : I0gan\n" + - "// @Module : Excel\n" + "// -------------------------------------------------------------------------\n\n"; - fwrite(strFileHead.c_str(), strFileHead.length(), 1, csWriter); - - ClassData *pBaseObject = classData.at("IObject"); - std::string allClassNames = "export const Excel={\n\t\t"; - for (std::map::const_iterator it = classData.begin(); it != classData.end(); ++it) { - const std::string &className = it->first; - ClassData *pClassDta = it->second; - - if (pClassDta->beIncluded || pClassDta->beParted || className == "Include") { - continue; - } - - // ts - std::string strPropertyInfo; - if (it != classData.begin()) { - allClassNames += ','; - } - allClassNames += className; - - strPropertyInfo += "\tclass " + className + "\n\t{\n"; - strPropertyInfo += "\t\t//Class name\n\t"; - strPropertyInfo += "\tpublic static ThisName = \"" + className + "\";\n"; - if (className != "IObject") { - // add base class properties - strPropertyInfo += "\t\t// IObject\n"; - - for (std::map::iterator itProperty = pBaseObject->xStructData.xPropertyList.begin(); - itProperty != pBaseObject->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *pClassProperty = itProperty->second; - - strPropertyInfo += "\t\tpublic static " + propertyName + " = \"" + propertyName + "\";"; - strPropertyInfo += "// " + pClassProperty->descList["Type"] + "\n"; - } - } - - strPropertyInfo += "\t\t// Property\n"; - for (std::map::iterator itProperty = pClassDta->xStructData.xPropertyList.begin(); - itProperty != pClassDta->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *pClassProperty = itProperty->second; - - strPropertyInfo += "\t\tpublic static " + propertyName + " = \"" + propertyName + "\";"; - strPropertyInfo += "// " + pClassProperty->descList["Type"] + "\n"; - } - - // include property, come from - - for (std::string item : pClassDta->includes) { - auto includeClass = classData.at(item); - - strPropertyInfo += "\t\t// Include Property, come from " + includeClass->xStructData.className + " \n"; - - for (std::map::iterator itProperty = includeClass->xStructData.xPropertyList.begin(); - itProperty != includeClass->xStructData.xPropertyList.end(); ++itProperty) { - const std::string &propertyName = itProperty->first; - ClassProperty *pClassProperty = itProperty->second; - - strPropertyInfo += "\t\tpublic static " + propertyName + " = \"" + propertyName + "\";"; - strPropertyInfo += "// " + pClassProperty->descList["Type"] + "\n"; - } - } - - fwrite(strPropertyInfo.c_str(), strPropertyInfo.length(), 1, csWriter); - - // record - std::string strRecordInfo = ""; - strRecordInfo += "\t\t// Record\n"; - - for (std::map::iterator itRecord = pClassDta->xStructData.xRecordList.begin(); - itRecord != pClassDta->xStructData.xRecordList.end(); ++itRecord) { - const std::string &recordName = itRecord->first; - ClassRecord *pClassRecord = itRecord->second; - - std::cout << "save for ts ---> " << className << "::" << recordName << std::endl; - - strRecordInfo += "\t\tpublic static " + recordName + " = \n\t\t{\n"; - strRecordInfo += "\t\t\t//Class name\n\t"; - strRecordInfo += "\t\t\"ThisName\":\"" + recordName + "\",\n"; - - // col - for (int i = 0; i < pClassRecord->colList.size(); ++i) { - for (std::map::iterator itCol = pClassRecord->colList.begin(); - itCol != pClassRecord->colList.end(); ++itCol) { - - const std::string &colTag = itCol->first; - ClassRecord::RecordColDesc *pRecordColDesc = itCol->second; - - if (pRecordColDesc->index == i) { - if (i != 0) { - strRecordInfo += ",\n"; - } - strRecordInfo += "\t\t\t\"" + colTag + "\":" + std::to_string(pRecordColDesc->index); - } - } - } - - strRecordInfo += "\n\t\t}\n"; - } - - for (std::string item : pClassDta->includes) { - auto includeClass = classData.at(item); - - strRecordInfo += "\t\t// Include Record, come from " + includeClass->xStructData.className + " \n"; - - for (std::map::iterator itRecord = includeClass->xStructData.xRecordList.begin(); - itRecord != includeClass->xStructData.xRecordList.end(); ++itRecord) { - const std::string &recordName = itRecord->first; - ClassRecord *pClassRecord = itRecord->second; - - strRecordInfo += "\t\tpublic static " + recordName + " = \n\t\t{\n"; - strRecordInfo += "\t\t\t//Class name\n\t"; - strRecordInfo += "\t\t\"ThisName\":\"" + recordName + "\",\n"; - - // col - for (int i = 0; i < pClassRecord->colList.size(); ++i) { - for (std::map::iterator itCol = pClassRecord->colList.begin(); - itCol != pClassRecord->colList.end(); ++itCol) { - - const std::string &colTag = itCol->first; - ClassRecord::RecordColDesc *pRecordColDesc = itCol->second; - - if (pRecordColDesc->index == i) { - if (i != 0) { - strRecordInfo += ",\n"; - } - strRecordInfo += "\t\t\t\"" + colTag + "\":" + std::to_string(pRecordColDesc->index); - } - } - } - - strRecordInfo += "\n\t\t}\n"; - } - } - - fwrite(strRecordInfo.c_str(), strRecordInfo.length(), 1, csWriter); - - std::string strHppEnumInfo = ""; - - std::string strClassEnd; - strClassEnd += "\n\t}\n"; - - fwrite(strClassEnd.c_str(), strClassEnd.length(), 1, csWriter); - } - allClassNames += "}\n"; - fwrite(allClassNames.c_str(), allClassNames.length(), 1, csWriter); - fclose(csWriter); - - return false; - } -}; -} // namespace sqkctl From 9eb71ab9db5321ca7dc1a20476ec46bfe1926205 Mon Sep 17 00:00:00 2001 From: i0gan Date: Sun, 22 Sep 2024 00:54:08 +0800 Subject: [PATCH 15/16] Bugfix: fixed the excel cannot export to xml when using linux wsp --- src/tools/sqkctl/CMakeLists.txt | 4 ++++ src/tools/sqkctl/excel/mini_excel_reader.cc | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tools/sqkctl/CMakeLists.txt b/src/tools/sqkctl/CMakeLists.txt index fe472712..f6879944 100644 --- a/src/tools/sqkctl/CMakeLists.txt +++ b/src/tools/sqkctl/CMakeLists.txt @@ -121,6 +121,10 @@ set_target_properties( ${proName} PROPERTIES ) endmacro(SquickOut) +if (UNIX) + SET ( CMAKE_CXX_FLAGS "-g" ) +endif() + SquickOut(${ProjectName} ${ProjectName} ${SolutionDir}/tools/bin ${ProjectName}) add_definitions( -D_CRT_SECURE_NO_WARNINGS diff --git a/src/tools/sqkctl/excel/mini_excel_reader.cc b/src/tools/sqkctl/excel/mini_excel_reader.cc index 77b5d460..4bac4bc3 100644 --- a/src/tools/sqkctl/excel/mini_excel_reader.cc +++ b/src/tools/sqkctl/excel/mini_excel_reader.cc @@ -41,7 +41,7 @@ bool Zip::open(const char *file) { char szCurrentFileName[PATH_MAX]; unz_file_info64 fileInfo; - int err = unzGoToNextFile2(_zipFile, &fileInfo, szCurrentFileName, sizeof(szCurrentFileName) - 1, nullptr, 0, nullptr, 0); + int err = unzGoToFirstFile2(_zipFile, &fileInfo, szCurrentFileName, sizeof(szCurrentFileName) - 1, nullptr, 0, nullptr, 0); while (err == UNZ_OK) { unz_file_pos posInfo; if (unzGetFilePos(_zipFile, &posInfo) == UNZ_OK) { @@ -52,7 +52,9 @@ bool Zip::open(const char *file) { entry.uncompressed_size = (uLong)fileInfo.uncompressed_size; _files[currentFileName] = entry; } + // std::cout << file << " loading: " << szCurrentFileName << " " << err << std::endl; err = unzGoToNextFile2(_zipFile, &fileInfo, szCurrentFileName, sizeof(szCurrentFileName) - 1, nullptr, 0, nullptr, 0); + } return true; From 64ff5d5b392b0531b5460fb7da8829eec62b886b Mon Sep 17 00:00:00 2001 From: i0gan Date: Sun, 22 Sep 2024 10:05:29 +0800 Subject: [PATCH 16/16] Simplify the excel --- resource/excel/Group.xlsx | Bin 9236 -> 8757 bytes resource/excel/Object.xlsx | Bin 0 -> 9086 bytes resource/excel/Player.xlsx | Bin 9666 -> 9216 bytes resource/excel/Scene.xlsx | Bin 11118 -> 10694 bytes resource/excel/common/IObject.xlsx | Bin 9848 -> 8936 bytes resource/excel/example/Property.xlsx | Bin 9580 -> 8940 bytes resource/excel/example/Record.xlsx | Bin 10507 -> 9903 bytes src/squick/plugin/world/cell_module.cc | 9 ++- src/squick/plugin/world/data_tail_module.cc | 2 +- src/squick/plugin/world/scene_module.cc | 48 ++++++++-------- src/squick/plugin/world/world_module.cc | 60 ++++++++++---------- 11 files changed, 59 insertions(+), 60 deletions(-) create mode 100644 resource/excel/Object.xlsx diff --git a/resource/excel/Group.xlsx b/resource/excel/Group.xlsx index 9f97bf0b90d25974fa93d275a0c0a7295ac6d8fa..59dab1882ecf83d60ee7e5823c7245e007d934e6 100644 GIT binary patch literal 8757 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 diff --git a/resource/excel/Object.xlsx b/resource/excel/Object.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f83bb0dabe24bec66addb4d21bfc06e05a88901f GIT binary patch literal 9086 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 V8R%c=p@U9zz=EPOB7S=P{{U$|k*oj! literal 0 HcmV?d00001 diff --git a/resource/excel/Player.xlsx b/resource/excel/Player.xlsx index 3ffe3c4f538ba8d1eafb4df2018b0d7e93133289..4f1ff835e83ecd8ff319db3609c7184a30e98884 100644 GIT binary patch literal 9216 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 literal 9666 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 NfKHe)?$ZAF_kVM-L398B diff --git a/resource/excel/Scene.xlsx b/resource/excel/Scene.xlsx index abbb6b4d880da544c758d81bee35c79e3e675b88..d8c0de6bf18cd09aaef4d5845d73b2bc5a962ddd 100644 GIT binary patch literal 10694 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 Yp9U0V!2duG`IQ+6`5ILT+1ua$2kY~Dt^fc4 literal 11118 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

4K5D#X*bG6u(hcKU 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 B6{-LL diff --git a/resource/excel/common/IObject.xlsx b/resource/excel/common/IObject.xlsx index f85b6ae7411e333ea0ad95e25ba7f4da1e0e938c..d95586bd536c1058d6df9a5b2d12563dd6def693 100644 GIT binary patch literal 8936 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 literal 9580 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 TKhVQ|AV48L^eTz!@#p^on6Eve literal 10507 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 diff --git a/src/squick/plugin/world/cell_module.cc b/src/squick/plugin/world/cell_module.cc index 5a84df6a..c7ec4f5e 100644 --- a/src/squick/plugin/world/cell_module.cc +++ b/src/squick/plugin/world/cell_module.cc @@ -17,7 +17,7 @@ bool CellModule::Start() { } bool CellModule::AfterStart() { - m_world_->AddClassCallBack(excel::Player::ThisName(), this, &CellModule::OnObjectEvent); + m_world_->AddClassCallBack(excel::Object::ThisName(), this, &CellModule::OnObjectEvent); // NF SYNC /*X @@ -376,15 +376,14 @@ int CellModule::AddMoveOutEventCallBack(CELL_MOVE_EVENT_FUNCTOR_PTR functorPtr) int CellModule::OnObjectEvent(const Guid &self, const std::string &classNames, const CLASS_OBJECT_EVENT classEvent, const DataList &var) { if (CLASS_OBJECT_EVENT::COE_CREATE_FINISH == classEvent) { - m_world_->AddPropertyCallBack(self, excel::IObject::Position(), this, &CellModule::OnPositionEvent); + m_world_->AddPropertyCallBack(self, excel::Object::Position(), this, &CellModule::OnPositionEvent); } - return 0; } int CellModule::OnPositionEvent(const Guid &self, const std::string &propertyName, const SquickData &oldVar, const SquickData &newVar, const INT64 reason) { - const int sceneID = m_world_->GetPropertyInt32(self, excel::IObject::SceneID()); - const int groupID = m_world_->GetPropertyInt32(self, excel::IObject::GroupID()); + const int sceneID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const int groupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); const Vector3 &oldVec = oldVar.GetVector3(); const Vector3 &newVec = newVar.GetVector3(); diff --git a/src/squick/plugin/world/data_tail_module.cc b/src/squick/plugin/world/data_tail_module.cc index daedd95b..4ff42264 100644 --- a/src/squick/plugin/world/data_tail_module.cc +++ b/src/squick/plugin/world/data_tail_module.cc @@ -21,7 +21,7 @@ bool DataTailModule::Update() { return true; } bool DataTailModule::AfterStart() { #ifdef SQUICK_DEBUG_MODE - m_world_->AddClassCallBack(excel::Player::ThisName(), this, &DataTailModule::OnClassObjectEvent); + m_world_->AddClassCallBack(excel::Object::ThisName(), this, &DataTailModule::OnClassObjectEvent); #endif return true; } diff --git a/src/squick/plugin/world/scene_module.cc b/src/squick/plugin/world/scene_module.cc index f38449a7..3e3a214f 100644 --- a/src/squick/plugin/world/scene_module.cc +++ b/src/squick/plugin/world/scene_module.cc @@ -119,8 +119,8 @@ bool SceneModule::RequestEnterScene(const Guid &self, const int sceneID, const i return false; } - const int nNowSceneID = m_world_->GetPropertyInt32(self, excel::Player::SceneID()); - const int nNowGroupID = m_world_->GetPropertyInt32(self, excel::Player::GroupID()); + const int nNowSceneID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const int nNowGroupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); if (nNowSceneID == sceneID && nNowGroupID == groupID) { LOG_INFO("Guid<%v> in same scene and group but it not a clone scene<%v>, group_id<%v> ", self.ToString(), sceneID, groupID); @@ -196,7 +196,7 @@ bool SceneModule::LeaveSceneGroup(const Guid &self) { } ///////// - const Vector3 &lastPos = m_world_->GetPropertyVector3(self, excel::IObject::Position()); + const Vector3 &lastPos = m_world_->GetPropertyVector3(self, excel::Object::Position()); BeforeLeaveSceneGroup(self, nOldSceneID, nOldGroupID, 0, DataList::Empty()); const Guid lastCell = m_pCellModule->ComputeCellID(lastPos); @@ -394,7 +394,7 @@ bool SceneModule::CreateSceneNPC(const int sceneID, const int groupID, const Dat int nWeight = m_world_->Random(0, 100); if (nWeight <= pResource->nWeight) { DataList arg; - arg << excel::IObject::Position() << pResource->vSeedPos; + arg << excel::Object::Position() << pResource->vSeedPos; // arg << SquickProtocol::NPC::SeedID() << pResource->seedID; arg.Append(argList); @@ -916,7 +916,7 @@ bool SceneModule::SwitchScene(const Guid &self, const int nTargetSceneID, const } ///////// - const Vector3 &lastPos = m_world_->GetPropertyVector3(self, excel::IObject::Position()); + const Vector3 &lastPos = m_world_->GetPropertyVector3(self, excel::Object::Position()); BeforeLeaveSceneGroup(self, nOldSceneID, nOldGroupID, type, arg); const Guid lastCell = m_pCellModule->ComputeCellID(lastPos); @@ -944,7 +944,7 @@ bool SceneModule::SwitchScene(const Guid &self, const int nTargetSceneID, const const Guid newCell = m_pCellModule->ComputeCellID(v); OnMoveCellEvent(self, nTargetGroupID, nTargetGroupID, Guid(), newCell); - pObject->SetPropertyVector3(excel::IObject::MoveTo(), v); + pObject->SetPropertyVector3(excel::Object::MoveTo(), v); ///////// AfterEnterSceneGroup(self, nTargetSceneID, nTargetGroupID, type, arg); @@ -1004,15 +1004,15 @@ int SceneModule::OnSceneRecordCommonEvent(const Guid &self, const RECORD_EVENT_D int SceneModule::OnPropertyCommonEvent(const Guid &self, const std::string &propertyName, const SquickData &oldVar, const SquickData &newVar, const INT64 reason) { - const std::string &className = m_world_->GetPropertyString(self, excel::IObject::ClassName()); - if (className == excel::Player::ThisName()) { + const std::string &className = m_world_->GetPropertyString(self, excel::Object::ClassName()); + if (className == excel::Object::ThisName()) { // only player can change grupid and sceneid - if (excel::Player::GroupID() == propertyName) { + if (excel::Object::GroupID() == propertyName) { OnPlayerGroupEvent(self, propertyName, oldVar, newVar); return 0; } - if (excel::Player::SceneID() == propertyName) { + if (excel::Object::SceneID() == propertyName) { OnPlayerSceneEvent(self, propertyName, oldVar, newVar); return 0; } @@ -1031,7 +1031,7 @@ int SceneModule::OnPropertyCommonEvent(const Guid &self, const std::string &prop int SceneModule::OnRecordCommonEvent(const Guid &self, const RECORD_EVENT_DATA &eventData, const SquickData &oldVar, const SquickData &newVar) { const std::string &recordName = eventData.recordName; - int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::Player::GroupID()); + int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); if (nObjectGroupID < 0) { return 0; @@ -1047,14 +1047,14 @@ int SceneModule::OnRecordCommonEvent(const Guid &self, const RECORD_EVENT_DATA & int SceneModule::OnClassCommonEvent(const Guid &self, const std::string &className, const CLASS_OBJECT_EVENT classEvent, const DataList &var) { if (CLASS_OBJECT_EVENT::COE_DESTROY == classEvent) { - const int nObjectSceneID = m_world_->GetPropertyInt32(self, excel::IObject::SceneID()); - const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::IObject::GroupID()); + const int nObjectSceneID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); if (nObjectGroupID < 0 || nObjectSceneID <= 0) { return 0; } - const Vector3 &pos = m_world_->GetPropertyVector3(self, excel::Player::Position()); + const Vector3 &pos = m_world_->GetPropertyVector3(self, excel::Object::Position()); DataList valueAllPlayrNoSelfList; m_pCellModule->GetCellObjectList(nObjectSceneID, nObjectGroupID, pos, valueAllPlayrNoSelfList, true, self); @@ -1070,7 +1070,7 @@ int SceneModule::OnClassCommonEvent(const Guid &self, const std::string &classNa DataList selfVar; selfVar << self; - if (className == excel::Player::ThisName()) { + if (className == excel::Object::ThisName()) { // tell youself, u want to enter this scene or this group OnObjectListEnter(selfVar, selfVar); @@ -1080,13 +1080,13 @@ int SceneModule::OnClassCommonEvent(const Guid &self, const std::string &classNa OnObjectListEnterFinished(selfVar, selfVar); } else { - const int nObjectSceneID = m_world_->GetPropertyInt32(self, excel::IObject::SceneID()); - const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::IObject::GroupID()); + const int nObjectSceneID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); if (nObjectGroupID < 0 || nObjectSceneID <= 0) { return 0; } - const Vector3 &pos = m_world_->GetPropertyVector3(self, excel::Player::Position()); + const Vector3 &pos = m_world_->GetPropertyVector3(self, excel::Object::Position()); DataList valueAllPlayrObjectList; m_pCellModule->GetCellObjectList(nObjectSceneID, nObjectGroupID, pos, valueAllPlayrObjectList, true); @@ -1105,8 +1105,8 @@ int SceneModule::OnClassCommonEvent(const Guid &self, const std::string &classNa int SceneModule::OnPlayerGroupEvent(const Guid &self, const std::string &propertyName, const SquickData &oldVar, const SquickData &newVar) { // this event only happened in the same scene - const int sceneID = m_world_->GetPropertyInt32(self, excel::IObject::SceneID()); - const Vector3 position = m_world_->GetPropertyVector3(self, excel::IObject::Position()); + const int sceneID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const Vector3 position = m_world_->GetPropertyVector3(self, excel::Object::Position()); int nOldGroupID = oldVar.GetInt32(); int nNewGroupID = newVar.GetInt32(); @@ -1206,11 +1206,11 @@ int SceneModule::OnPlayerSceneEvent(const Guid &self, const std::string &propert } int SceneModule::GetBroadCastObject(const Guid &self, const std::string &propertyName, const bool bTable, DataList &valueObject) { - const int nObjectContainerID = m_world_->GetPropertyInt32(self, excel::IObject::SceneID()); - const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::IObject::GroupID()); - const Vector3 &position = m_world_->GetPropertyVector3(self, excel::IObject::Position()); + const int nObjectContainerID = m_world_->GetPropertyInt32(self, excel::Object::SceneID()); + const int nObjectGroupID = m_world_->GetPropertyInt32(self, excel::Object::GroupID()); + const Vector3 &position = m_world_->GetPropertyVector3(self, excel::Object::Position()); - const std::string &className = m_world_->GetPropertyString(self, excel::IObject::ClassName()); + const std::string &className = m_world_->GetPropertyString(self, excel::Object::ClassName()); std::shared_ptr pClassRecordManager = m_class_->GetClassRecordManager(className); std::shared_ptr pClassPropertyManager = m_class_->GetClassPropertyManager(className); diff --git a/src/squick/plugin/world/world_module.cc b/src/squick/plugin/world/world_module.cc index e605254f..a972deed 100644 --- a/src/squick/plugin/world/world_module.cc +++ b/src/squick/plugin/world/world_module.cc @@ -148,13 +148,13 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s { Vector3 vRelivePos = m_scene_->GetRelivePosition(sceneID, 0); - pObject->SetPropertyString(excel::IObject::ConfigID(), configIndex); - pObject->SetPropertyString(excel::IObject::ClassName(), className); - pObject->SetPropertyInt(excel::IObject::SceneID(), sceneID); - pObject->SetPropertyInt(excel::IObject::GroupID(), groupID); - pObject->SetPropertyVector3(excel::IObject::Position(), vRelivePos); + pObject->SetPropertyString(excel::Object::ConfigID(), configIndex); + pObject->SetPropertyString(excel::Object::ClassName(), className); + pObject->SetPropertyInt(excel::Object::SceneID(), sceneID); + pObject->SetPropertyInt(excel::Object::GroupID(), groupID); + pObject->SetPropertyVector3(excel::Object::Position(), vRelivePos); - pContainerInfo->AddObjectToGroup(groupID, ident, className == excel::Player::ThisName() ? true : false); + pContainerInfo->AddObjectToGroup(groupID, ident, className == excel::Object::ThisName() ? true : false); DoEvent(ident, className, pObject->GetState(), arg); } @@ -186,9 +186,9 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s std::shared_ptr pPropertyManager = pObject->GetPropertyManager(); for (int i = 0; i < arg.GetCount() - 1; i += 2) { const std::string &propertyName = arg.String(i); - if (excel::IObject::ConfigID() != propertyName && excel::IObject::ClassName() != propertyName && - excel::IObject::SceneID() != propertyName && excel::IObject::ID() != propertyName && - excel::IObject::GroupID() != propertyName) { + if (excel::Object::ConfigID() != propertyName && excel::Object::ClassName() != propertyName && + excel::Object::SceneID() != propertyName && excel::Object::ID() != propertyName && + excel::Object::GroupID() != propertyName) { std::shared_ptr pArgProperty = pPropertyManager->GetElement(propertyName); if (pArgProperty) { switch (pArgProperty->GetType()) { @@ -222,7 +222,7 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s stream << " config_name: " << configIndex; stream << " scene_id: " << sceneID; stream << " group_id: " << groupID; - stream << " position: " << pObject->GetPropertyVector3(excel::IObject::Position()).ToString(); + stream << " position: " << pObject->GetPropertyVector3(excel::Object::Position()).ToString(); LOG_INFO("%v", stream.str()); @@ -302,14 +302,14 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s { Vector3 vRelivePos = m_scene_->GetRelivePosition(sceneID, 0); - pObject->SetPropertyObject(excel::IObject::ID(), ident); - pObject->SetPropertyString(excel::IObject::ConfigID(), configIndex); - pObject->SetPropertyString(excel::IObject::ClassName(), className); - pObject->SetPropertyInt(excel::IObject::SceneID(), sceneID); - pObject->SetPropertyInt(excel::IObject::GroupID(), groupID); - pObject->SetPropertyVector3(excel::IObject::Position(), vRelivePos); + pObject->SetPropertyObject(excel::Object::ID(), ident); + pObject->SetPropertyString(excel::Object::ConfigID(), configIndex); + pObject->SetPropertyString(excel::Object::ClassName(), className); + pObject->SetPropertyInt(excel::Object::SceneID(), sceneID); + pObject->SetPropertyInt(excel::Object::GroupID(), groupID); + pObject->SetPropertyVector3(excel::Object::Position(), vRelivePos); - pContainerInfo->AddObjectToGroup(groupID, ident, className == excel::Player::ThisName() ? true : false); + pContainerInfo->AddObjectToGroup(groupID, ident, className == excel::Object::ThisName() ? true : false); DoEvent(ident, className, pObject->GetState(), arg); } @@ -338,8 +338,8 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s std::shared_ptr pPropertyManager = pObject->GetPropertyManager(); for (int i = 0; i < arg.GetCount() - 1; i += 2) { const std::string &propertyName = arg.String(i); - if (excel::IObject::ConfigID() != propertyName && excel::IObject::ClassName() != propertyName && excel::IObject::SceneID() != propertyName && - excel::IObject::ID() != propertyName && excel::IObject::GroupID() != propertyName) { + if (excel::Object::ConfigID() != propertyName && excel::Object::ClassName() != propertyName && excel::Object::SceneID() != propertyName && + excel::Object::ID() != propertyName && excel::Object::GroupID() != propertyName) { std::shared_ptr pArgProperty = pPropertyManager->GetElement(propertyName); if (pArgProperty) { switch (pArgProperty->GetType()) { @@ -373,7 +373,7 @@ std::shared_ptr WorldModule::CreateObject(const Guid &self, const int s stream << " config_name: " << configIndex; stream << " scene_id: " << sceneID; stream << " group_id: " << groupID; - stream << " position: " << pObject->GetPropertyVector3(excel::IObject::Position()).ToString(); + stream << " position: " << pObject->GetPropertyVector3(excel::Object::Position()).ToString(); // m_log_->LogInfo(stream); @@ -421,20 +421,20 @@ bool WorldModule::DestroyObject(const Guid &self) { return DestroySelf(self); } - const int sceneID = GetPropertyInt32(self, excel::IObject::SceneID()); - const int groupID = GetPropertyInt32(self, excel::IObject::GroupID()); + const int sceneID = GetPropertyInt32(self, excel::Object::SceneID()); + const int groupID = GetPropertyInt32(self, excel::Object::GroupID()); std::shared_ptr pContainerInfo = m_scene_->GetElement(sceneID); if (pContainerInfo) { - const std::string &className = GetPropertyString(self, excel::IObject::ClassName()); - if (className == excel::Player::ThisName()) { + const std::string &className = GetPropertyString(self, excel::Object::ClassName()); + if (className == excel::Object::ThisName()) { m_scene_->LeaveSceneGroup(self); } DoEvent(self, className, COE_BEFOREDESTROY, DataList::Empty()); DoEvent(self, className, COE_DESTROY, DataList::Empty()); - if (className != excel::Player::ThisName()) { + if (className != excel::Object::ThisName()) { pContainerInfo->RemoveObjectFromGroup(groupID, self, false); } @@ -1134,7 +1134,7 @@ bool WorldModule::GetGroupObjectList(const int sceneID, const int groupID, const continue; } - if (this->GetPropertyString(xID, excel::IObject::ClassName()) == className && xID != noSelf) { + if (this->GetPropertyString(xID, excel::Object::ClassName()) == className && xID != noSelf) { list.AddObject(xID); } } @@ -1167,8 +1167,8 @@ bool WorldModule::LogInfo(const Guid ident) { std::shared_ptr pObject = GetObject(ident); if (pObject) { - int sceneID = GetPropertyInt32(ident, excel::IObject::SceneID()); - int groupID = GetPropertyInt32(ident, excel::IObject::GroupID()); + int sceneID = GetPropertyInt32(ident, excel::Object::SceneID()); + int groupID = GetPropertyInt32(ident, excel::Object::GroupID()); LOG_INFO("Guid<%v> SceneID<%v>", ident.ToString(), sceneID); } else { LOG_ERROR("Guid<%v> There is no object", ident.ToString()); @@ -1191,7 +1191,7 @@ int WorldModule::OnPropertyCommonEvent(const Guid &self, const std::string &prop pFun->operator()(self, propertyName, oldVar, newVar, reason); } - const std::string &className = xObject->GetPropertyString(excel::IObject::ClassName()); + const std::string &className = xObject->GetPropertyString(excel::Object::ClassName()); std::map>::iterator itClass = mtClassPropertyCallBackList.find(className); if (itClass != mtClassPropertyCallBackList.end()) { std::list::iterator itList = itClass->second.begin(); @@ -1304,7 +1304,7 @@ int WorldModule::OnRecordCommonEvent(const Guid &self, const RECORD_EVENT_DATA & } } - const std::string &className = xObject->GetPropertyString(excel::IObject::ClassName()); + const std::string &className = xObject->GetPropertyString(excel::Object::ClassName()); std::map>::iterator itClass = mtClassRecordCallBackList.find(className); if (itClass != mtClassRecordCallBackList.end()) { std::list::iterator itList = itClass->second.begin();