Implement skins unlock/dress/undress

This commit is contained in:
xeon 2025-03-20 20:12:09 +03:00
parent 42fdc33849
commit 5586f4cae1
14 changed files with 1101 additions and 5 deletions

View file

@ -6,6 +6,7 @@
"UnlockAllHollow",
"UnlockAllHollowBuff",
"UnlockAllCafeItem",
"UnlockAllAvatarSkin",
"finishquest 1 0",
"finishquest 3 0",
"addquest 5 4030136"

View file

@ -72,9 +72,36 @@ pub async fn execute_command(context: &mut CommandContext<'_>, command: &GMComma
GMCommand::UnlockAllHollow => gm_unlock_all_hollow(context).await,
GMCommand::UnlockAllHollowBuff => gm_unlock_all_hollow_buff(context).await,
GMCommand::UnlockAllCafeItem => gm_unlock_all_cafe_item(context).await,
GMCommand::UnlockAllAvatarSkin => gm_unlock_all_avatar_skin(context).await,
}
}
async fn gm_unlock_all_avatar_skin(context: &mut CommandContext<'_>) {
context
.player
.item_model
.add_or_use_materials(
&context
.state
.filecfg
.avatar_skin_base_template_tb()
.data()
.unwrap()
.iter()
.map(|tmpl| (tmpl.id() as u32, 1).into())
.collect::<Vec<_>>(),
)
.await;
context.add_notify(PlayerSyncScNotify {
item_sync: Some(ItemSync {
material_list: context.player.item_model.get_protocol_material_list(),
..Default::default()
}),
..Default::default()
});
}
async fn gm_unlock_all_hollow(context: &mut CommandContext<'_>) {
context
.player

View file

@ -101,7 +101,18 @@ impl ItemModel {
.transaction::<_, (), DbErr>(|txn| {
Box::pin(async move {
for model in updated_models {
model.update(txn).await?;
material::Entity::insert(model)
.on_conflict(
OnConflict::new()
.exprs([
Expr::col(material::Column::OwnerPlayerUid),
Expr::col(material::Column::Id),
])
.update_column(material::Column::Num)
.to_owned(),
)
.exec(txn)
.await?;
}
Ok(())
@ -185,3 +196,9 @@ impl ItemModel {
.collect()
}
}
impl From<(u32, i32)> for MaterialDelta {
fn from((id, num): (u32, i32)) -> Self {
Self { id, num }
}
}

View file

@ -2,7 +2,7 @@ use std::collections::{HashMap, HashSet};
use trigger_database::entity::avatar;
use trigger_database::prelude::*;
use trigger_logic::skill::EAvatarSkillType;
use trigger_logic::{skill::EAvatarSkillType, template_ext::TemplateExt};
use trigger_protocol::{Avatar, AvatarSkillLevel, DressedEquip};
use trigger_sv::time_util;
@ -325,6 +325,36 @@ impl RoleModel {
}
}
pub async fn dress_avatar_skin(&mut self, avatar_id: i32, avatar_skin_id: i32) -> bool {
if avatar_skin_id != 0
&& !self
.context
.filecfg
.skin_targets_avatar(avatar_skin_id, avatar_id)
{
return false;
}
if let Some(avatar) = self.avatar_map.remove(&(avatar_id as u32)) {
let model = avatar::ActiveModel {
avatar_skin_id: Set(avatar_skin_id),
..avatar.into()
};
self.avatar_map.insert(
avatar_id as u32,
model
.update(self.context.database)
.await
.expect("avatar::update failed"),
);
true
} else {
false
}
}
pub fn is_avatar_unlocked(&self, avatar_id: u32) -> bool {
self.avatar_map.contains_key(&avatar_id)
}

View file

@ -32,7 +32,8 @@ mod avatar_module {
.weapon_dress(
request.avatar_id,
request.weapon_uid as i32,
equip_model.is_signature_weapon(request.weapon_uid as i32, request.avatar_id as i32)
equip_model
.is_signature_weapon(request.weapon_uid as i32, request.avatar_id as i32),
)
.await
{
@ -194,4 +195,53 @@ mod avatar_module {
ToggleWeaponShowScRsp { retcode: 1 }
}
pub async fn on_dress_avatar_skin(
context: &mut MessageContext<'_, '_>,
request: DressAvatarSkinCsReq,
) -> DressAvatarSkinScRsp {
let item_model = &context.player.item_model;
if item_model.has_enough_material(request.avatar_skin_id, 1) {
let role_model = &mut context.player.role_model;
if role_model
.dress_avatar_skin(request.avatar_id as i32, request.avatar_skin_id as i32)
.await
{
let avatar_list = role_model.get_protocol_avatar_list(&[request.avatar_id]);
context.add_notify(PlayerSyncScNotify {
avatar_sync: Some(AvatarSync { avatar_list }),
..Default::default()
});
return DressAvatarSkinScRsp { retcode: 0 };
}
}
DressAvatarSkinScRsp { retcode: 1 }
}
pub async fn on_undress_avatar_skin(
context: &mut MessageContext<'_, '_>,
request: UndressAvatarSkinCsReq,
) -> UndressAvatarSkinScRsp {
// Why separate packet, retards?
let role_model = &mut context.player.role_model;
if role_model
.dress_avatar_skin(request.avatar_id as i32, 0)
.await
{
let avatar_list = role_model.get_protocol_avatar_list(&[request.avatar_id]);
context.add_notify(PlayerSyncScNotify {
avatar_sync: Some(AvatarSync { avatar_list }),
..Default::default()
});
return UndressAvatarSkinScRsp { retcode: 0 };
}
UndressAvatarSkinScRsp { retcode: 1 }
}
}

View file

@ -14,6 +14,7 @@ pub mod prelude {
pub use sea_orm::entity::ActiveValue::*;
pub use sea_orm::entity::prelude::*;
pub use sea_orm::query::Condition;
pub use sea_orm::sea_query::OnConflict;
}
#[derive(Debug, Deserialize)]

View file

@ -558,6 +558,33 @@ table EquipmentLevelTemplate {
unk_6: int;
}
table AvatarSkinBaseTemplate {
id: int;
server_only_0: int;
DLFHPHCLIBA: string;
NFIEGMLEEFE: string;
avatar_id: int;
server_only_1: int;
server_only_2: int;
server_only_3: int;
GMBBOEGOEPH: string;
HMIOIBHJGCM: [string];
server_only_4: int;
OEMHKAENMHN: int;
FGJJELBGBBC: string;
FKBJLMBAPDI: int;
server_only_5: int;
server_only_6: int;
server_only_7: int;
server_only_8: int;
server_only_9: int;
DIGLJDFKAMN: string;
BKFKIDCLHKL: int;
FHJDONJMNKP: string;
AHHLKMJEEAE: string;
HPMCPJGPKJB: int;
}
table AvatarBaseTemplateTb {
data: [AvatarBaseTemplate];
}
@ -656,4 +683,8 @@ table AvatarPassiveSkillTemplateTb {
table EquipmentLevelTemplateTb {
data: [EquipmentLevelTemplate];
}
}
table AvatarSkinBaseTemplateTb {
data: [AvatarSkinBaseTemplate];
}

View file

@ -14292,6 +14292,696 @@ impl core::fmt::Debug for EquipmentLevelTemplate<'_> {
ds.finish()
}
}
pub enum AvatarSkinBaseTemplateOffset {}
#[derive(Copy, Clone, PartialEq)]
pub struct AvatarSkinBaseTemplate<'a> {
pub _tab: flatbuffers::Table<'a>,
}
impl<'a> flatbuffers::Follow<'a> for AvatarSkinBaseTemplate<'a> {
type Inner = AvatarSkinBaseTemplate<'a>;
#[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self {
_tab: flatbuffers::Table::new(buf, loc),
}
}
}
impl<'a> AvatarSkinBaseTemplate<'a> {
pub const VT_ID: flatbuffers::VOffsetT = 4;
pub const VT_SERVER_ONLY_0: flatbuffers::VOffsetT = 6;
pub const VT_DLFHPHCLIBA: flatbuffers::VOffsetT = 8;
pub const VT_NFIEGMLEEFE: flatbuffers::VOffsetT = 10;
pub const VT_AVATAR_ID: flatbuffers::VOffsetT = 12;
pub const VT_SERVER_ONLY_1: flatbuffers::VOffsetT = 14;
pub const VT_SERVER_ONLY_2: flatbuffers::VOffsetT = 16;
pub const VT_SERVER_ONLY_3: flatbuffers::VOffsetT = 18;
pub const VT_GMBBOEGOEPH: flatbuffers::VOffsetT = 20;
pub const VT_HMIOIBHJGCM: flatbuffers::VOffsetT = 22;
pub const VT_SERVER_ONLY_4: flatbuffers::VOffsetT = 24;
pub const VT_OEMHKAENMHN: flatbuffers::VOffsetT = 26;
pub const VT_FGJJELBGBBC: flatbuffers::VOffsetT = 28;
pub const VT_FKBJLMBAPDI: flatbuffers::VOffsetT = 30;
pub const VT_SERVER_ONLY_5: flatbuffers::VOffsetT = 32;
pub const VT_SERVER_ONLY_6: flatbuffers::VOffsetT = 34;
pub const VT_SERVER_ONLY_7: flatbuffers::VOffsetT = 36;
pub const VT_SERVER_ONLY_8: flatbuffers::VOffsetT = 38;
pub const VT_SERVER_ONLY_9: flatbuffers::VOffsetT = 40;
pub const VT_DIGLJDFKAMN: flatbuffers::VOffsetT = 42;
pub const VT_BKFKIDCLHKL: flatbuffers::VOffsetT = 44;
pub const VT_FHJDONJMNKP: flatbuffers::VOffsetT = 46;
pub const VT_AHHLKMJEEAE: flatbuffers::VOffsetT = 48;
pub const VT_HPMCPJGPKJB: flatbuffers::VOffsetT = 50;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
AvatarSkinBaseTemplate { _tab: table }
}
#[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
args: &'args AvatarSkinBaseTemplateArgs<'args>,
) -> flatbuffers::WIPOffset<AvatarSkinBaseTemplate<'bldr>> {
let mut builder = AvatarSkinBaseTemplateBuilder::new(_fbb);
builder.add_HPMCPJGPKJB(args.HPMCPJGPKJB);
if let Some(x) = args.AHHLKMJEEAE {
builder.add_AHHLKMJEEAE(x);
}
if let Some(x) = args.FHJDONJMNKP {
builder.add_FHJDONJMNKP(x);
}
builder.add_BKFKIDCLHKL(args.BKFKIDCLHKL);
if let Some(x) = args.DIGLJDFKAMN {
builder.add_DIGLJDFKAMN(x);
}
builder.add_server_only_9(args.server_only_9);
builder.add_server_only_8(args.server_only_8);
builder.add_server_only_7(args.server_only_7);
builder.add_server_only_6(args.server_only_6);
builder.add_server_only_5(args.server_only_5);
builder.add_FKBJLMBAPDI(args.FKBJLMBAPDI);
if let Some(x) = args.FGJJELBGBBC {
builder.add_FGJJELBGBBC(x);
}
builder.add_OEMHKAENMHN(args.OEMHKAENMHN);
builder.add_server_only_4(args.server_only_4);
if let Some(x) = args.HMIOIBHJGCM {
builder.add_HMIOIBHJGCM(x);
}
if let Some(x) = args.GMBBOEGOEPH {
builder.add_GMBBOEGOEPH(x);
}
builder.add_server_only_3(args.server_only_3);
builder.add_server_only_2(args.server_only_2);
builder.add_server_only_1(args.server_only_1);
builder.add_avatar_id(args.avatar_id);
if let Some(x) = args.NFIEGMLEEFE {
builder.add_NFIEGMLEEFE(x);
}
if let Some(x) = args.DLFHPHCLIBA {
builder.add_DLFHPHCLIBA(x);
}
builder.add_server_only_0(args.server_only_0);
builder.add_id(args.id);
builder.finish()
}
#[inline]
pub fn id(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_ID, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_0(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_0, Some(0))
.unwrap()
}
}
#[inline]
pub fn DLFHPHCLIBA(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_DLFHPHCLIBA,
None,
)
}
}
#[inline]
pub fn NFIEGMLEEFE(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_NFIEGMLEEFE,
None,
)
}
}
#[inline]
pub fn avatar_id(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_AVATAR_ID, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_1(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_1, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_2(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_2, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_3(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_3, Some(0))
.unwrap()
}
}
#[inline]
pub fn GMBBOEGOEPH(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_GMBBOEGOEPH,
None,
)
}
}
#[inline]
pub fn HMIOIBHJGCM(
&self,
) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<
flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>,
>>(AvatarSkinBaseTemplate::VT_HMIOIBHJGCM, None)
}
}
#[inline]
pub fn server_only_4(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_4, Some(0))
.unwrap()
}
}
#[inline]
pub fn OEMHKAENMHN(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_OEMHKAENMHN, Some(0))
.unwrap()
}
}
#[inline]
pub fn FGJJELBGBBC(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_FGJJELBGBBC,
None,
)
}
}
#[inline]
pub fn FKBJLMBAPDI(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_FKBJLMBAPDI, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_5(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_5, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_6(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_6, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_7(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_7, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_8(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_8, Some(0))
.unwrap()
}
}
#[inline]
pub fn server_only_9(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_9, Some(0))
.unwrap()
}
}
#[inline]
pub fn DIGLJDFKAMN(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_DIGLJDFKAMN,
None,
)
}
}
#[inline]
pub fn BKFKIDCLHKL(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_BKFKIDCLHKL, Some(0))
.unwrap()
}
}
#[inline]
pub fn FHJDONJMNKP(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_FHJDONJMNKP,
None,
)
}
}
#[inline]
pub fn AHHLKMJEEAE(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(
AvatarSkinBaseTemplate::VT_AHHLKMJEEAE,
None,
)
}
}
#[inline]
pub fn HPMCPJGPKJB(&self) -> i32 {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab
.get::<i32>(AvatarSkinBaseTemplate::VT_HPMCPJGPKJB, Some(0))
.unwrap()
}
}
}
impl flatbuffers::Verifiable for AvatarSkinBaseTemplate<'_> {
#[inline]
fn run_verifier(
v: &mut flatbuffers::Verifier,
pos: usize,
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
use self::flatbuffers::Verifiable;
v.visit_table(pos)?
.visit_field::<i32>("id", Self::VT_ID, false)?
.visit_field::<i32>("server_only_0", Self::VT_SERVER_ONLY_0, false)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"DLFHPHCLIBA",
Self::VT_DLFHPHCLIBA,
false,
)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"NFIEGMLEEFE",
Self::VT_NFIEGMLEEFE,
false,
)?
.visit_field::<i32>("avatar_id", Self::VT_AVATAR_ID, false)?
.visit_field::<i32>("server_only_1", Self::VT_SERVER_ONLY_1, false)?
.visit_field::<i32>("server_only_2", Self::VT_SERVER_ONLY_2, false)?
.visit_field::<i32>("server_only_3", Self::VT_SERVER_ONLY_3, false)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"GMBBOEGOEPH",
Self::VT_GMBBOEGOEPH,
false,
)?
.visit_field::<flatbuffers::ForwardsUOffset<
flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>,
>>("HMIOIBHJGCM", Self::VT_HMIOIBHJGCM, false)?
.visit_field::<i32>("server_only_4", Self::VT_SERVER_ONLY_4, false)?
.visit_field::<i32>("OEMHKAENMHN", Self::VT_OEMHKAENMHN, false)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"FGJJELBGBBC",
Self::VT_FGJJELBGBBC,
false,
)?
.visit_field::<i32>("FKBJLMBAPDI", Self::VT_FKBJLMBAPDI, false)?
.visit_field::<i32>("server_only_5", Self::VT_SERVER_ONLY_5, false)?
.visit_field::<i32>("server_only_6", Self::VT_SERVER_ONLY_6, false)?
.visit_field::<i32>("server_only_7", Self::VT_SERVER_ONLY_7, false)?
.visit_field::<i32>("server_only_8", Self::VT_SERVER_ONLY_8, false)?
.visit_field::<i32>("server_only_9", Self::VT_SERVER_ONLY_9, false)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"DIGLJDFKAMN",
Self::VT_DIGLJDFKAMN,
false,
)?
.visit_field::<i32>("BKFKIDCLHKL", Self::VT_BKFKIDCLHKL, false)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"FHJDONJMNKP",
Self::VT_FHJDONJMNKP,
false,
)?
.visit_field::<flatbuffers::ForwardsUOffset<&str>>(
"AHHLKMJEEAE",
Self::VT_AHHLKMJEEAE,
false,
)?
.visit_field::<i32>("HPMCPJGPKJB", Self::VT_HPMCPJGPKJB, false)?
.finish();
Ok(())
}
}
pub struct AvatarSkinBaseTemplateArgs<'a> {
pub id: i32,
pub server_only_0: i32,
pub DLFHPHCLIBA: Option<flatbuffers::WIPOffset<&'a str>>,
pub NFIEGMLEEFE: Option<flatbuffers::WIPOffset<&'a str>>,
pub avatar_id: i32,
pub server_only_1: i32,
pub server_only_2: i32,
pub server_only_3: i32,
pub GMBBOEGOEPH: Option<flatbuffers::WIPOffset<&'a str>>,
pub HMIOIBHJGCM: Option<
flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>,
>,
pub server_only_4: i32,
pub OEMHKAENMHN: i32,
pub FGJJELBGBBC: Option<flatbuffers::WIPOffset<&'a str>>,
pub FKBJLMBAPDI: i32,
pub server_only_5: i32,
pub server_only_6: i32,
pub server_only_7: i32,
pub server_only_8: i32,
pub server_only_9: i32,
pub DIGLJDFKAMN: Option<flatbuffers::WIPOffset<&'a str>>,
pub BKFKIDCLHKL: i32,
pub FHJDONJMNKP: Option<flatbuffers::WIPOffset<&'a str>>,
pub AHHLKMJEEAE: Option<flatbuffers::WIPOffset<&'a str>>,
pub HPMCPJGPKJB: i32,
}
impl<'a> Default for AvatarSkinBaseTemplateArgs<'a> {
#[inline]
fn default() -> Self {
AvatarSkinBaseTemplateArgs {
id: 0,
server_only_0: 0,
DLFHPHCLIBA: None,
NFIEGMLEEFE: None,
avatar_id: 0,
server_only_1: 0,
server_only_2: 0,
server_only_3: 0,
GMBBOEGOEPH: None,
HMIOIBHJGCM: None,
server_only_4: 0,
OEMHKAENMHN: 0,
FGJJELBGBBC: None,
FKBJLMBAPDI: 0,
server_only_5: 0,
server_only_6: 0,
server_only_7: 0,
server_only_8: 0,
server_only_9: 0,
DIGLJDFKAMN: None,
BKFKIDCLHKL: 0,
FHJDONJMNKP: None,
AHHLKMJEEAE: None,
HPMCPJGPKJB: 0,
}
}
}
pub struct AvatarSkinBaseTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
}
impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarSkinBaseTemplateBuilder<'a, 'b, A> {
#[inline]
pub fn add_id(&mut self, id: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_ID, id, 0);
}
#[inline]
pub fn add_server_only_0(&mut self, server_only_0: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_0, server_only_0, 0);
}
#[inline]
pub fn add_DLFHPHCLIBA(&mut self, DLFHPHCLIBA: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_DLFHPHCLIBA,
DLFHPHCLIBA,
);
}
#[inline]
pub fn add_NFIEGMLEEFE(&mut self, NFIEGMLEEFE: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_NFIEGMLEEFE,
NFIEGMLEEFE,
);
}
#[inline]
pub fn add_avatar_id(&mut self, avatar_id: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_AVATAR_ID, avatar_id, 0);
}
#[inline]
pub fn add_server_only_1(&mut self, server_only_1: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_1, server_only_1, 0);
}
#[inline]
pub fn add_server_only_2(&mut self, server_only_2: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_2, server_only_2, 0);
}
#[inline]
pub fn add_server_only_3(&mut self, server_only_3: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_3, server_only_3, 0);
}
#[inline]
pub fn add_GMBBOEGOEPH(&mut self, GMBBOEGOEPH: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_GMBBOEGOEPH,
GMBBOEGOEPH,
);
}
#[inline]
pub fn add_HMIOIBHJGCM(
&mut self,
HMIOIBHJGCM: flatbuffers::WIPOffset<
flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<&'b str>>,
>,
) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_HMIOIBHJGCM,
HMIOIBHJGCM,
);
}
#[inline]
pub fn add_server_only_4(&mut self, server_only_4: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_4, server_only_4, 0);
}
#[inline]
pub fn add_OEMHKAENMHN(&mut self, OEMHKAENMHN: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_OEMHKAENMHN, OEMHKAENMHN, 0);
}
#[inline]
pub fn add_FGJJELBGBBC(&mut self, FGJJELBGBBC: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_FGJJELBGBBC,
FGJJELBGBBC,
);
}
#[inline]
pub fn add_FKBJLMBAPDI(&mut self, FKBJLMBAPDI: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_FKBJLMBAPDI, FKBJLMBAPDI, 0);
}
#[inline]
pub fn add_server_only_5(&mut self, server_only_5: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_5, server_only_5, 0);
}
#[inline]
pub fn add_server_only_6(&mut self, server_only_6: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_6, server_only_6, 0);
}
#[inline]
pub fn add_server_only_7(&mut self, server_only_7: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_7, server_only_7, 0);
}
#[inline]
pub fn add_server_only_8(&mut self, server_only_8: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_8, server_only_8, 0);
}
#[inline]
pub fn add_server_only_9(&mut self, server_only_9: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_SERVER_ONLY_9, server_only_9, 0);
}
#[inline]
pub fn add_DIGLJDFKAMN(&mut self, DIGLJDFKAMN: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_DIGLJDFKAMN,
DIGLJDFKAMN,
);
}
#[inline]
pub fn add_BKFKIDCLHKL(&mut self, BKFKIDCLHKL: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_BKFKIDCLHKL, BKFKIDCLHKL, 0);
}
#[inline]
pub fn add_FHJDONJMNKP(&mut self, FHJDONJMNKP: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_FHJDONJMNKP,
FHJDONJMNKP,
);
}
#[inline]
pub fn add_AHHLKMJEEAE(&mut self, AHHLKMJEEAE: flatbuffers::WIPOffset<&'b str>) {
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(
AvatarSkinBaseTemplate::VT_AHHLKMJEEAE,
AHHLKMJEEAE,
);
}
#[inline]
pub fn add_HPMCPJGPKJB(&mut self, HPMCPJGPKJB: i32) {
self.fbb_
.push_slot::<i32>(AvatarSkinBaseTemplate::VT_HPMCPJGPKJB, HPMCPJGPKJB, 0);
}
#[inline]
pub fn new(
_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
) -> AvatarSkinBaseTemplateBuilder<'a, 'b, A> {
let start = _fbb.start_table();
AvatarSkinBaseTemplateBuilder {
fbb_: _fbb,
start_: start,
}
}
#[inline]
pub fn finish(self) -> flatbuffers::WIPOffset<AvatarSkinBaseTemplate<'a>> {
let o = self.fbb_.end_table(self.start_);
flatbuffers::WIPOffset::new(o.value())
}
}
impl core::fmt::Debug for AvatarSkinBaseTemplate<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let mut ds = f.debug_struct("AvatarSkinBaseTemplate");
ds.field("id", &self.id());
ds.field("server_only_0", &self.server_only_0());
ds.field("DLFHPHCLIBA", &self.DLFHPHCLIBA());
ds.field("NFIEGMLEEFE", &self.NFIEGMLEEFE());
ds.field("avatar_id", &self.avatar_id());
ds.field("server_only_1", &self.server_only_1());
ds.field("server_only_2", &self.server_only_2());
ds.field("server_only_3", &self.server_only_3());
ds.field("GMBBOEGOEPH", &self.GMBBOEGOEPH());
ds.field("HMIOIBHJGCM", &self.HMIOIBHJGCM());
ds.field("server_only_4", &self.server_only_4());
ds.field("OEMHKAENMHN", &self.OEMHKAENMHN());
ds.field("FGJJELBGBBC", &self.FGJJELBGBBC());
ds.field("FKBJLMBAPDI", &self.FKBJLMBAPDI());
ds.field("server_only_5", &self.server_only_5());
ds.field("server_only_6", &self.server_only_6());
ds.field("server_only_7", &self.server_only_7());
ds.field("server_only_8", &self.server_only_8());
ds.field("server_only_9", &self.server_only_9());
ds.field("DIGLJDFKAMN", &self.DIGLJDFKAMN());
ds.field("BKFKIDCLHKL", &self.BKFKIDCLHKL());
ds.field("FHJDONJMNKP", &self.FHJDONJMNKP());
ds.field("AHHLKMJEEAE", &self.AHHLKMJEEAE());
ds.field("HPMCPJGPKJB", &self.HPMCPJGPKJB());
ds.finish()
}
}
pub enum AvatarBaseTemplateTbOffset {}
#[derive(Copy, Clone, PartialEq)]
@ -17304,3 +17994,123 @@ impl core::fmt::Debug for EquipmentLevelTemplateTb<'_> {
ds.finish()
}
}
pub enum AvatarSkinBaseTemplateTbOffset {}
#[derive(Copy, Clone, PartialEq)]
pub struct AvatarSkinBaseTemplateTb<'a> {
pub _tab: flatbuffers::Table<'a>,
}
impl<'a> flatbuffers::Follow<'a> for AvatarSkinBaseTemplateTb<'a> {
type Inner = AvatarSkinBaseTemplateTb<'a>;
#[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self {
_tab: flatbuffers::Table::new(buf, loc),
}
}
}
impl<'a> AvatarSkinBaseTemplateTb<'a> {
pub const VT_DATA: flatbuffers::VOffsetT = 4;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
AvatarSkinBaseTemplateTb { _tab: table }
}
#[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
args: &'args AvatarSkinBaseTemplateTbArgs<'args>,
) -> flatbuffers::WIPOffset<AvatarSkinBaseTemplateTb<'bldr>> {
let mut builder = AvatarSkinBaseTemplateTbBuilder::new(_fbb);
if let Some(x) = args.data {
builder.add_data(x);
}
builder.finish()
}
#[inline]
pub fn data(
&self,
) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<AvatarSkinBaseTemplate<'a>>>>
{
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
unsafe {
self._tab.get::<flatbuffers::ForwardsUOffset<
flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<AvatarSkinBaseTemplate>>,
>>(AvatarSkinBaseTemplateTb::VT_DATA, None)
}
}
}
impl flatbuffers::Verifiable for AvatarSkinBaseTemplateTb<'_> {
#[inline]
fn run_verifier(
v: &mut flatbuffers::Verifier,
pos: usize,
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
use self::flatbuffers::Verifiable;
v.visit_table(pos)?
.visit_field::<flatbuffers::ForwardsUOffset<
flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<AvatarSkinBaseTemplate>>,
>>("data", Self::VT_DATA, false)?
.finish();
Ok(())
}
}
pub struct AvatarSkinBaseTemplateTbArgs<'a> {
pub data: Option<
flatbuffers::WIPOffset<
flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<AvatarSkinBaseTemplate<'a>>>,
>,
>,
}
impl<'a> Default for AvatarSkinBaseTemplateTbArgs<'a> {
#[inline]
fn default() -> Self {
AvatarSkinBaseTemplateTbArgs { data: None }
}
}
pub struct AvatarSkinBaseTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
}
impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarSkinBaseTemplateTbBuilder<'a, 'b, A> {
#[inline]
pub fn add_data(
&mut self,
data: flatbuffers::WIPOffset<
flatbuffers::Vector<'b, flatbuffers::ForwardsUOffset<AvatarSkinBaseTemplate<'b>>>,
>,
) {
self.fbb_
.push_slot_always::<flatbuffers::WIPOffset<_>>(AvatarSkinBaseTemplateTb::VT_DATA, data);
}
#[inline]
pub fn new(
_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
) -> AvatarSkinBaseTemplateTbBuilder<'a, 'b, A> {
let start = _fbb.start_table();
AvatarSkinBaseTemplateTbBuilder {
fbb_: _fbb,
start_: start,
}
}
#[inline]
pub fn finish(self) -> flatbuffers::WIPOffset<AvatarSkinBaseTemplateTb<'a>> {
let o = self.fbb_.end_table(self.start_);
flatbuffers::WIPOffset::new(o.value())
}
}
impl core::fmt::Debug for AvatarSkinBaseTemplateTb<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let mut ds = f.debug_struct("AvatarSkinBaseTemplateTb");
ds.field("data", &self.data());
ds.finish()
}
}

View file

@ -1,4 +1,4 @@
#[allow(dead_code, unused_imports, unsafe_op_in_unsafe_fn)]
#[allow(dead_code, unused_imports, unsafe_op_in_unsafe_fn, non_snake_case)]
#[path = "../gen_flatbuffers/tables_generated.rs"]
mod data;
pub mod main_city_script;
@ -65,4 +65,5 @@ file_cfg! {
WeaponStarTemplateTb;
AvatarPassiveSkillTemplateTb;
EquipmentLevelTemplateTb;
AvatarSkinBaseTemplateTb;
}

View file

@ -2,6 +2,7 @@ use trigger_fileconfig::NapFileCfg;
pub trait TemplateExt {
fn is_player_avatar(&self, avatar_id: i32) -> bool;
fn skin_targets_avatar(&self, avatar_skin_id: i32, avatar_id: i32) -> bool;
fn procedure_allows_select_role(&self, procedure_id: i32) -> bool;
fn is_last_procedure(&self, procedure_id: i32) -> bool;
}
@ -16,6 +17,16 @@ impl TemplateExt for NapFileCfg {
.unwrap_or(false)
}
fn skin_targets_avatar(&self, avatar_skin_id: i32, avatar_id: i32) -> bool {
self.avatar_skin_base_template_tb()
.data()
.unwrap()
.iter()
.find(|tmpl| tmpl.id() == avatar_skin_id)
.map(|tmpl| tmpl.avatar_id() == avatar_id)
.unwrap_or(false)
}
fn procedure_allows_select_role(&self, procedure_id: i32) -> bool {
self.procedure_config_template_tb()
.data()

View file

@ -647,6 +647,15 @@ pub struct BeginnerbattleRebeginScRsp {
pub retcode: i32,
}
#[derive(trigger_protobuf_derive::CmdID)]
#[cmdid(7562)]
#[derive(trigger_protobuf_derive::XorFields)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct UndressAvatarSkinCsReq {
#[xor(4218)]
#[prost(uint32, tag = "12")]
pub avatar_id: u32,
}
#[derive(trigger_protobuf_derive::CmdID)]
#[derive(trigger_protobuf_derive::XorFields)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RallySceneInfo {
@ -1930,6 +1939,18 @@ pub struct GetBattlePassDataCsReq {}
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct PostEnterWorldCsReq {}
#[derive(trigger_protobuf_derive::CmdID)]
#[cmdid(8883)]
#[derive(trigger_protobuf_derive::XorFields)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct DressAvatarSkinCsReq {
#[xor(6961)]
#[prost(uint32, tag = "7")]
pub avatar_id: u32,
#[xor(59)]
#[prost(uint32, tag = "12")]
pub avatar_skin_id: u32,
}
#[derive(trigger_protobuf_derive::CmdID)]
#[derive(trigger_protobuf_derive::XorFields)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct PublicVariable {

View file

@ -315,6 +315,14 @@ pub fn pb_to_common_protocol_unit(
);
Ok(Some(common_protocol_message.into()))
}
UndressAvatarSkinCsReq::CMD_ID => {
let mut pb_message = UndressAvatarSkinCsReq::decode(pb)?;
pb_message.xor_fields();
let common_protocol_message = ::trigger_protocol::UndressAvatarSkinCsReq::from(
pb_message,
);
Ok(Some(common_protocol_message.into()))
}
GetPlayerInfoCsReq::CMD_ID => {
let mut pb_message = GetPlayerInfoCsReq::decode(pb)?;
pb_message.xor_fields();
@ -1035,6 +1043,14 @@ pub fn pb_to_common_protocol_unit(
);
Ok(Some(common_protocol_message.into()))
}
DressAvatarSkinCsReq::CMD_ID => {
let mut pb_message = DressAvatarSkinCsReq::decode(pb)?;
pb_message.xor_fields();
let common_protocol_message = ::trigger_protocol::DressAvatarSkinCsReq::from(
pb_message,
);
Ok(Some(common_protocol_message.into()))
}
GetNewsStandDataCsReq::CMD_ID => {
let mut pb_message = GetNewsStandDataCsReq::decode(pb)?;
pb_message.xor_fields();
@ -1550,6 +1566,14 @@ pub fn common_protocol_unit_to_pb(
pb_message.xor_fields();
Ok(Some((BeginnerbattleRebeginScRsp::CMD_ID, pb_message.encode_to_vec())))
}
::trigger_protocol::UndressAvatarSkinCsReq::CMD_ID => {
let common_protocol_message = ::trigger_protocol::UndressAvatarSkinCsReq::decode(
&mut ::std::io::Cursor::new(&unit.blob),
)?;
let mut pb_message = UndressAvatarSkinCsReq::from(common_protocol_message);
pb_message.xor_fields();
Ok(Some((UndressAvatarSkinCsReq::CMD_ID, pb_message.encode_to_vec())))
}
::trigger_protocol::GetPlayerInfoCsReq::CMD_ID => {
let common_protocol_message = ::trigger_protocol::GetPlayerInfoCsReq::decode(
&mut ::std::io::Cursor::new(&unit.blob),
@ -2313,6 +2337,14 @@ pub fn common_protocol_unit_to_pb(
pb_message.xor_fields();
Ok(Some((PostEnterWorldCsReq::CMD_ID, pb_message.encode_to_vec())))
}
::trigger_protocol::DressAvatarSkinCsReq::CMD_ID => {
let common_protocol_message = ::trigger_protocol::DressAvatarSkinCsReq::decode(
&mut ::std::io::Cursor::new(&unit.blob),
)?;
let mut pb_message = DressAvatarSkinCsReq::from(common_protocol_message);
pb_message.xor_fields();
Ok(Some((DressAvatarSkinCsReq::CMD_ID, pb_message.encode_to_vec())))
}
::trigger_protocol::GetNewsStandDataCsReq::CMD_ID => {
let common_protocol_message = ::trigger_protocol::GetNewsStandDataCsReq::decode(
&mut ::std::io::Cursor::new(&unit.blob),
@ -3637,6 +3669,24 @@ for BeginnerbattleRebeginScRsp {
}
}
#[allow(unused)]
impl From<UndressAvatarSkinCsReq> for ::trigger_protocol::UndressAvatarSkinCsReq {
fn from(value: UndressAvatarSkinCsReq) -> Self {
Self {
avatar_id: value.avatar_id.into(),
..Default::default()
}
}
}
#[allow(unused)]
impl From<::trigger_protocol::UndressAvatarSkinCsReq> for UndressAvatarSkinCsReq {
fn from(value: ::trigger_protocol::UndressAvatarSkinCsReq) -> Self {
Self {
avatar_id: value.avatar_id.into(),
..Default::default()
}
}
}
#[allow(unused)]
impl From<RallySceneInfo> for ::trigger_protocol::RallySceneInfo {
fn from(value: RallySceneInfo) -> Self {
Self {
@ -5865,6 +5915,26 @@ impl From<::trigger_protocol::PostEnterWorldCsReq> for PostEnterWorldCsReq {
}
}
#[allow(unused)]
impl From<DressAvatarSkinCsReq> for ::trigger_protocol::DressAvatarSkinCsReq {
fn from(value: DressAvatarSkinCsReq) -> Self {
Self {
avatar_id: value.avatar_id.into(),
avatar_skin_id: value.avatar_skin_id.into(),
..Default::default()
}
}
}
#[allow(unused)]
impl From<::trigger_protocol::DressAvatarSkinCsReq> for DressAvatarSkinCsReq {
fn from(value: ::trigger_protocol::DressAvatarSkinCsReq) -> Self {
Self {
avatar_id: value.avatar_id.into(),
avatar_skin_id: value.avatar_skin_id.into(),
..Default::default()
}
}
}
#[allow(unused)]
impl From<PublicVariable> for ::trigger_protocol::PublicVariable {
fn from(value: PublicVariable) -> Self {
Self {

View file

@ -1052,6 +1052,31 @@ pub struct GetAvatarRecommendEquipScRsp {
pub retcode: i32,
}
#[derive(Default, Debug, Clone, Encodeable, Decodeable, ClientCmdID)]
#[id(842)]
pub struct DressAvatarSkinCsReq {
pub avatar_id: u32,
pub avatar_skin_id: u32,
}
#[derive(Default, Debug, Clone, Encodeable, Decodeable, ClientCmdID)]
#[id(843)]
pub struct DressAvatarSkinScRsp {
pub retcode: i32,
}
#[derive(Default, Debug, Clone, Encodeable, Decodeable, ClientCmdID)]
#[id(844)]
pub struct UndressAvatarSkinCsReq {
pub avatar_id: u32,
}
#[derive(Default, Debug, Clone, Encodeable, Decodeable, ClientCmdID)]
#[id(845)]
pub struct UndressAvatarSkinScRsp {
pub retcode: i32,
}
// Bangboo
#[derive(Default, Debug, Clone, Encodeable, Decodeable, ClientCmdID)]

View file

@ -43,6 +43,7 @@ pub enum GMCommand {
UnlockAllHollow = 302,
UnlockAllHollowBuff = 400,
UnlockAllCafeItem = 401,
UnlockAllAvatarSkin = 402,
}
#[derive(thiserror::Error, Debug)]