commit ff03600ae9a3bf43be2bda2106dbe43b5542ae60 Author: Art_Sakura <1754798088@qq.com> Date: Thu Oct 15 14:14:58 2026 +0800 update # 初始化仓库 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..21de56a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +trim_trailing_whitespace = true + +[*.py] +indent_size = 4 +max_line_length = 80 + +[*.{json,yml,yaml,toml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[legacy/**] +trim_trailing_whitespace = false +insert_final_newline = unset +end_of_line = unset diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d81de8d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,19 @@ +* text=auto +*.py text eol=lf +*.md text eol=lf +*.json text eol=lf +*.toml text eol=lf +*.yaml text eol=lf +*.yml text eol=lf +*.html text eol=lf +*.sh text eol=lf +*.ps1 text eol=lf +*.png binary +*.jpg binary +*.jpeg binary +*.db binary +*.woff binary +*.woff2 binary + +# Preserve exact legacy bytes so manifest hashes survive checkout +legacy/** -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf3447c --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# Python bytecode, native extensions and interpreter caches +__pycache__/ +*.py[cod] +*$py.class +*.so +*.pyd + +# Virtual environments and local Python version selection +.venv/ +venv/ +env/ +ENV/ +.python-version + +# Build and packaging outputs +/build/ +/dist/ +/wheelhouse/ +*.egg-info/ +.eggs/ +*.egg +pip-wheel-metadata/ + +# Test, lint, typing, coverage and profiling outputs +.pytest_cache/ +.ruff_cache/ +.mypy_cache/ +.pyright/ +.tox/ +.nox/ +.hypothesis/ +.coverage +.coverage.* +htmlcov/ +coverage.xml +*.prof +*.lprof + +# Local configuration and credentials; keep distributable templates +.env +.env.* +!.env.example +!.env.*.example +*.pem +*.key +/secrets/ +/config.local.* +/settings.local.* + +# Editors, operating system and temporary files +.idea/ +.vscode/ +.DS_Store +Thumbs.db +Desktop.ini +*.swp +*.swo +*~ +*.tmp +*.part + +# Farm runtime state: never version player data or generated images +/data/ +/runtime/ +/cache/ +/tmp/ +/temp/ +/logs/ +/backups/ +/exports/ +/downloads/ +/uploads/ +/artifacts/ +/.local/ +**/farm_db/ +**/farm_res/ +*.log +*.log.* +*.db +*.sqlite +*.sqlite3 +*.db-journal +*.db-wal +*.db-shm +*.sqlite-journal +*.sqlite-wal +*.sqlite-shm +*.sqlite3-journal +*.sqlite3-wal +*.sqlite3-shm +*.bak +*.backup + +# Exact allowlist: bundled static crop catalogues, not player databases +!/legacy/zhenxun_plugin_farm/resource/db/plant.db +!/legacy/zhenxun_plugin_farm/resource/db/plant-test.db + +# Legacy downloads and generated render output +/legacy/zhenxun_plugin_farm/config/sign_in.json +/legacy/zhenxun_plugin_farm/config/signTemp.json +/legacy/zhenxun_plugin_farm/resource/html/*.png + +# Local publication checkouts; not submodules or source directories +/.release-workspaces/ +/.release-staging/ +/.release-cache/ + +# Local agent installation and runtime state; AGENTS.md remains tracked +/.agents/ +/.codex/ +/.codebase-memory/ +/.comet/* +!/.comet/config.yaml diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..b5204b4 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,31 @@ +# Farm 协作约定 + +- 面向用户的回复及设计文档使用中文;区分事实、建议、待确认和已完成修改。 +- 本仓库是唯一开发源;三个框架发布仓库由未来流水线生成,不直接维护业务副本。 +- 检查、审查、规划默认只读;实现需要明确授权。 +- legacy/zhenxun_plugin_farm 为迁移参考基线。除已记录的凭据移除,不修改基线业务;修复应进入新实现并关联审查编号。 +- 新代码使用 Python,4 空格缩进,行长 80;枚举、数据结构及字段说明保持完整。 +- 核心不得导入 nonebot、astrbot、zhenxun;框架对象、用户事件和聊天消息止于接入层。 +- 数据库保存权威业务状态;交易由业务服务定义边界,底层方法不得自行提交上层事务。 +- 数量和内部货币使用整数;禁止将累计值传给增量接口;不足应失败,不静默归零。 +- 关键交易记录结构化日志与流水;不记录令牌、凭据、完整事件或真实玩家数据。 +- 使用本地文件工具检查源码;结构查询优先代码图,缺失或过期时核对源文件。 +- legacy-manifest.json 用于核对迁移完整性;更新基线必须记录差异和来源。 +- .release-workspaces 不进入主仓库。本轮用户要求停止拉取,已删除本地克隆;不得自行重新克隆、fetch、pull 或推送。 +- docs 中的框架接入和发布流水线属于设计,未实现部分不得报告为已完成。 + +## Comet Ambient Resume + +在这个仓库中,开始处理需要改动或调查的任务前,如果可能存在活跃 Comet workflow,把当前用户请求传入只读探针:`comet resume-probe . --stdin --json`。 + +- 如果用户通过宿主明确调用任意 Comet Skill(例如 `@comet`、`/comet`、`@comet-native` 或 `/comet-hotfix`),显式调用优先于本恢复协议;不要运行 resume probe,直接进入被调用的 Skill。 +- 如果用户通过宿主明确调用的是非 Comet 的 Skill 或斜杠命令,任务意图已由该调用明确:不要运行 resume probe,直接执行该 Skill。 +- 如果你正在 Comet 流程内(包括正在等待用户回复你在流程中提出的问题),不要运行 resume probe;把这类回复(例如方案/选项选择)当作当前 change 的继续,直接按用户的选择推进。 +- 只信任返回的 `workflow`、`skill` 和 `entrySource`;它们只由项目配置或无配置兼容回退决定。不得扫描或切换另一套 workflow。 +- 如果 probe 返回 `auto_resume`,简短说明选中的 active change,并进入 `nextCommand` 指向的永久入口。不要把状态命令当作恢复入口直接推进。 +- 如果 probe 返回 `ask_user`,只问一个简短问题并等待用户回复。 +- 如果当前请求未明确调用 Comet Skill,且 probe 返回 `out_of_scope` 或 `none`,不要进入 Comet workflow。 +- `out_of_scope` 或 `none` 只表示不要因为这个新请求进入 Comet workflow;它绝不表示要暂停或退出一个已在进行的 Comet 流程。 +- 如果配置或状态无效且没有 `nextCommand`,停止并报告原因;不要猜测另一个 workflow。 +- 不能只因为存在 active change 就把无关任务挂到该 change。Native 的未提交改动由 Native 入口检查,不由探针自动归因。 + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f27bec9 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Farm + +一个源码主仓库、多框架发布仓库的农场插件翻新项目。 + +当前阶段:初始化、旧代码保全与设计评审。新的跨框架农场尚未实现, +本目录不能直接作为 NoneBot、AstrBot 或真寻插件安装。 + +## 当前已有内容 + +- docs/:长期规划、架构、业务约束、发布设计、迁移与源码审查。 +- legacy/zhenxun_plugin_farm/:旧 Beta 分支代码与资源的迁移基线。 +- src/、integrations/、tests/、release/:职责说明和未来实施位置。 +- scripts/check_baseline.py:离线校验迁移清单、Python 语法及静态数据库。 +- Git 已本地初始化为 main;没有配置主仓库远程,也未提交或推送。 + +先读 [文档索引](docs/README.md),再读 +[待确认决策](docs/07-decisions.md)。 + +## 校验 + +使用 Python 3.10 或更高版本: + +```text +python scripts/check_baseline.py +git status --short +``` + +脚本不启动机器人,不执行网络请求,不读真实玩家数据库。 +语法通过不等于插件加载或玩法正确。 + +## 来源与许可证 + +旧代码来源为 Shu-Ying/zhenxun_plugin_farm 的 Beta 分支, +提交 b015c6c1997f146f651b677382980d338a306bb2。 +保留原 GPLv3 LICENSE、原作者信息和旧 README。 +素材权属尚需逐项核对,不因代码许可证而自动完成素材授权判断。 + +同步副本中的服务令牌已改为读取 FARM_SERVICE_TOKEN 环境变量, +其余源码与资源复制差异见 docs/legacy-manifest.json。 +不要直接部署含已知业务缺陷的迁移基线。 diff --git a/docs/01-roadmap.md b/docs/01-roadmap.md new file mode 100644 index 0000000..2436708 --- /dev/null +++ b/docs/01-roadmap.md @@ -0,0 +1,46 @@ +# 长期规划 + +## 已确认目标 + +一个 farm 主仓库统一开发农场逻辑;面向真寻、普通 NoneBot 和 +AstrBot 生成不同插件;三个发布仓库只承载各自的安装内容。 +用户不需要下载其他框架的接入代码。 + +保留旧项目功能作为需求调查基础,不默认旧实现正确,也不默认旧 +README 中所有功能都要无条件保留。先修数据一致性,再增加玩法。 + +## 建议的首个版本范围 + +保留开通农场、查看、种子商店、购买、播种、收获、铲除、出售、 +锁定、土地升级、签到、偷菜、改名。逐项核对旧指令与返回行为。 +真寻金币兑换为真寻专有可选能力;其他框架不凭空生成外部金币。 +点券、远程签到与星级规则在决策确认后进入规格。 + +首版不做交易行、钓鱼、跨实例在线联机、账号自动绑定、Web 后台、 +通用插件引擎、复杂事件总线和微服务。后续依据需求增加。 + +## 里程碑和退出条件 + +| 阶段 | 工作 | 完成标准 | +|---|---|---| +| M0 初始化 | 代码保全、审查、设计和忽略规则 | 哈希可验证;实现与计划状态清楚 | +| M1 规格收敛 | 确定身份、共享范围、经济与迁移策略 | 决策表关键项已确认,行为示例可验收 | +| M2 核心与存储 | 注册、货币、库存、迁移及事务 | 无框架依赖;失败回滚、重试幂等、并发余额测试通过 | +| M3 种植闭环 | 购买→播种→收获→出售、土地升级 | 边界、星级、锁定、经验计算及时间测试通过 | +| M4 真寻接入 | 保留既有用户入口,迁移旧数据 | 真实宿主的安装、启停、文本/图片与恢复演练通过 | +| M5 其他接入 | 普通 NoneBot、AstrBot | 每个宿主独立安装;无其他框架依赖;功能矩阵通过 | +| M6 发布链路 | 分包、来源清单、发布仓库同步 | ZIP/wheel 安装测试、凭据与体积检查、可重试发布通过 | +| M7 稳定运营 | 性能、备份、资源供应与升级 | 有容量指标、兼容矩阵和版本回滚演练 | +| M8 可选联机 | 独立服务、账号映射、共享状态 | 另立需求,不直接共用多个进程的 SQLite 文件 | + +阶段顺序表达依赖,不作未经验证的工期承诺。M4/M5 先打通一个最小 +指令与完整交易闭环,再扩展全部指令;不要先写完所有框架外壳。 + +## 质量门槛 + +- 新玩法先给数值和边界例子;保留用户接受的契约。 +- 每次修改聚焦一个可验收用例,避免同时换数据库、框架和玩法。 +- 测试以交易不变量、并发、迁移和真实安装为主,不只检查函数返回。 +- 核心测试不能依赖机器人、外网或图片渲染器。 +- 每次发布追溯到主仓库提交、目标、资源版本、schema 和依赖清单。 +- 所有目标达到对应门槛才能称为“支持”;未实现目标保持禁用。 diff --git a/docs/02-architecture.md b/docs/02-architecture.md new file mode 100644 index 0000000..1a825c4 --- /dev/null +++ b/docs/02-architecture.md @@ -0,0 +1,110 @@ +# 代码设计与目录 + +## 原则与当前状态 + +下列为建议设计,尚未实现。当前旧代码位于 legacy,未把其全局变量、 +数据库管理器和服务定位器直接当作新核心继续复用。 + +采用一个共享 Python 包,内部按职责划分,避免先建多个互相依赖的 +独立发行包。共享源码只维护一份;发布时复制进各插件私有目录。 + +## 目标结构 + +```text +farm/ + src/farm_core/ + domain/ # 规则、值对象、状态转换,不做 I/O + application/ # 注册/购买/播种等用例,拥有事务边界 + ports/ # 必要的仓储事务、时钟、外部钱包契约 + infrastructure/ + sqlite/ # 连接、仓储、schema migration + resources/ # 作物目录、资源校验与更新 + presentation/ # 框架无关展示数据;可选图片渲染 + integrations/ + zhenxun/ # 真寻命令、配置、金币、数据目录、生命周期 + nonebot/ # 普通 NoneBot 插件,不导入真寻 + astrbot/ # AstrBot 插件,不导入 NoneBot 或真寻 + assets/ # 经整理、版本化的资源,尚未从 legacy 提取 + tests/ + unit/ integration/ contracts/ migrations/ packaging/ + release/ # 构建目标、文件白名单、依赖与模板 + scripts/ # 离线校验、迁移、未来打包工具 + legacy/ # 旧实现参考;不进入新插件安装包 + docs/ +``` + +本轮只创建职责说明及迁移基线,不生成大量空模块或假实现。 +当一个用例实施时,才创建所需模块。 + +## 依赖方向 + +```mermaid +flowchart TD + Z[真寻接入] --> A[应用用例] + N[NoneBot 接入] --> A + B[AstrBot 接入] --> A + A --> D[领域规则] + A --> P[必要接口] + S[SQLite 实现] --> P + R[资源实现] --> P + Z --> C[组装与生命周期] + N --> C + B --> C + C --> S + C --> R + A --> V[展示数据] + V --> I[可选图片渲染] +``` + +基础设施实现接口,由宿主启动阶段组装并注入;领域与应用代码不能 +访问框架全局对象、事件、配置管理器或消息发送 API。 +记录日志使用标准 logging,接入层按需桥接宿主日志。 + +## 每层的责任 + +| 层 | 应做 | 禁止混入 | +|---|---|---| +| 命令接入 | 参数解析、用户上下文、权限、确认、发送回复 | 再写一套价格/奖励计算 | +| 应用用例 | 业务校验、幂等、事务、调用领域计算 | 对聊天平台对象直接操作 | +| 领域规则 | 土地/星级/经验计算与状态转换 | SQL、网络、图片、框架导入 | +| 存储 | 条件更新、查询、schema 升级 | 命令文案、签到奖励选择、图片 | +| 展示 | 将结果渲染为文本/图片 | 修改余额和农场状态 | +| 资源 | 校验、版本、缓存与原子切换 | 未验证即覆盖线上目录 | + +命令与业务服务返回明确结果,例如成功、余额不足、种子不足、 +已处理、状态冲突;结果包含展示所需数值和错误码。 +数据库故障不能转换成“没有记录”或“没有农场”。 + +## 最小接口建议 + +- UnitOfWork:一次用例获取同一事务下的仓储;成功才提交。 +- Clock:提供带时区的当前时间,使跨日、成熟和签到可测试。 +- PlantCatalog:提供带版本的作物定义,已种植实例绑定规则版本。 +- ExternalWallet:仅在真寻金币等外部经济接入时启用,明确幂等与补偿。 + +不要为字符串工具、日志和每个函数都建接口。 +领域对象使用明确数据类型,取代任意 dict[Any, Any]。 +注册、库存、地块、货币、收获周期分别建模,枚举及字段有说明。 + +## 生命周期和异步模型 + +导入模块时不启动清理线程、不连接数据库、不发送网络请求。 +宿主启动:验证配置→迁移→初始化仓储/资源→就绪; +宿主停止:拒绝新写入→等待在途用例→关闭连接和任务。 + +首期建议单进程嵌入式部署。不要用 threading.RLock 代替异步业务锁。 +事务连接生命周期由 UnitOfWork 管理;即使使用进程内锁,SQL 仍需 +条件更新和唯一约束。查询缓存首期可不做;需要时在提交后失效, +不缓存不存在的用户作为有效玩家,不把缓存余额作为扣款依据。 + +## 发布时的包隔离 + +src/farm_core 内部一律采用相对导入。 +构建时复制为 <插件包>/_vendor/farm_core,接入层经包内路径导入。 +_vendor 必须是普通包且顶层初始化无副作用。 +禁止把共享核心作为全局同名 farm_core 安装后又在插件中带另一份, +避免同时安装真寻/NoneBot 包时导入碰撞。 + +第三方依赖只列核心必需项和当前接入层项;渲染依赖可选。 +私有命名空间能隔离源码名称,不能隔离同一 Python 进程的第三方依赖 +版本;冲突必须通过兼容测试或分进程解决。 diff --git a/docs/03-business-rules.md b/docs/03-business-rules.md new file mode 100644 index 0000000..2910431 --- /dev/null +++ b/docs/03-business-rules.md @@ -0,0 +1,101 @@ +# 业务逻辑与一致性设计 + +状态:以下是建议约束。涉及用户资产归属、玩法与跨实例互通的选择, +需按 07-decisions.md 确认后进入正式规格。 + +## 身份与农场归属 + +框架(真寻/NoneBot/AstrBot)不等于消息平台(QQ/Telegram 等)。 +玩家至少需要 deployment_id、realm_id、platform、platform_user_id; +platform_user_id 保存字符串,禁止跨平台按相同数字自动认定同一人。 + +建议独立部署默认独立数据,realm 可配置群内或部署内共享。 +各协议暴露的同平台 ID 也未必同义,官方 QQ 的开放标识与 OneBot +账号不能自动合并。迁移需要明确来源命名空间、人工确认映射与审计。 + +双人操作如偷菜必须确定双方处于同一允许交互的 realm, +检查自己偷自己、跨群目标、无农场目标和权限。@对象解析留在接入层。 + +## 货币与库存 + +- 内部货币、数量使用整数;设置合理上限并检查乘法后的范围。 +- 增量和设置新值采用不同接口名称;应用层不能直接写余额缓存。 +- 扣款使用数据库条件更新,例如余额足够才扣减,检查实际影响行数。 +- 不足返回明确失败;不能静默把负余额截成零后继续发货。 +- 每次资产变动记录 operation_id、actor、realm、币种、增量、原因、 + 关联物品和提交时间;日志不代替可查询的账本。 +- 已锁定作物在单项出售、批量出售、交易与其他消耗入口采用一致规则。 +- 所有数量入口测试 0、负数、缺省、超大值、全部数量与库存不足; + 命令层的默认参数不得被误当成任意合法业务值。 + +## 购买与出售 + +购买:读取有效目录→校验数量/等级→同一事务中校验和扣款→增加种子 +→写操作流水→提交→生成展示数据。任一步失败整体回滚。 + +出售:按明确数量计算可出售库存→同一事务中检查锁定和库存版本 +→扣库存→只增加本次收益→流水→提交。返回实际成交数量与新余额。 +网络发送失败不回滚已成交交易;重试同一 operation_id 返回原结果。 + +## 播种与收获 + +播种:空地校验、种子消耗、星级选择、作物实例创建在同一事务中。 +土地收益与生长速度采用已确认公式,记录规则或目录版本, +不能让资源更新悄悄改变已播种作物的结算契约。 + +收获:每块地独立计算产量和经验,再求和;不对累计经验反复加成。 +每轮作物有可辨识的 cycle_id/harvest_index,防止重试和并发重复领奖。 +作物入仓、经验增加、收获次数、下一成熟时间或枯萎状态、偷取记录 +的结算必须在同一业务事务内完成。精确的事务批次由全收获与部分成功 +策略决定,先定义用户可见结果,不能任意留半完成状态。 + +未种植、生长中、成熟、枯萎是明确状态;不要用多组互相冲突的布尔值 +表示同一阶段。除草、虫害、施肥等独立属性另行建模。 + +## 签到、升级与确认 + +签到采用明确业务时区,(realm、player、business_date) 唯一; +签到记录、奖励发放、累计奖励领取标记在同一事务内。 +“已签到”与“新签到成功”分开返回,防止重复展示发奖。 +补签与连续签到规则分别定义,不从字段名猜测。 + +开垦和土地升级在用户确认后重新读取余额与地块状态,重新校验条件。 +确认凭据绑定发起人、会话、动作、参数、过期时间和一次性标识; +不能把任何消息里的“是”当作任意待办操作的确认。 +升级使作物成熟这一旧行为需明确保留或调整。 + +## 幂等与并发 + +operation_id 由框架事件标识与部署作用域产生;没有稳定事件标识时, +用已持久化的交互操作标识,而不是每次重试生成新的随机 ID。 +同一操作不同参数应拒绝,不能错误复用第一次结果。 + +唯一约束、条件更新或状态版本是最终防线。 +进程内锁只作辅助,跨进程不能共享这把锁。 +单实例 SQLite 的连接/事务应由一个明确管理者协调; +BEGIN 的锁等待、busy timeout、取消回滚、事务嵌套和连接关闭都要测试。 +WAL 是部署选项,不能解决错误的业务事务边界。 + +## 外部金币兑换 + +真寻金币和本地农场币位于不同存储,不能承诺一个本地 SQLite 事务 +同时回滚两边。先核对外部钱包是否支持 operation_id、条件扣款、 +查询和退款;使用持久化兑换单与可重试状态机协调。 +无法确认结果时进入待对账状态,禁止直接重复扣款或盲目发币。 + +普通 NoneBot、AstrBot 默认只支持内部农场货币; +外部经济系统通过能力配置接入,不导入真寻代码。 +兑换比例、手续费、舍入、最小单位和失败恢复写入明确规格。 + +## 时间、事件与展示 + +保存 UTC 时间戳,业务日期按配置时区计算;日志记录时区语义。 +时钟可注入,覆盖午夜、闰日、月切换和重启后的结算。 + +核心状态改变必须由事务内显式步骤完成。 +提交后的消息、图片、统计等副作用失败不撤销已提交业务; +需要可靠重试时使用操作结果或持久化任务。事件槽捕获异常不能把 +必需的资产更新失败隐藏成成功。首期不必新增通用事件总线。 + +展示读取业务结果,不在绘图过程中更新余额或土地; +图片失败回退文本,不重复执行业务。 diff --git a/docs/04-release-design.md b/docs/04-release-design.md new file mode 100644 index 0000000..1bb06b9 --- /dev/null +++ b/docs/04-release-design.md @@ -0,0 +1,101 @@ +# 一个主仓库与多个发布仓库 + +## 已确认的仓库关系 + +| 角色 | 远程地址 | 建议职责 | +|---|---|---| +| 开发主仓库 | 尚未提供;本地 D:/Work/farm | 业务、接入、测试、文档、构建的唯一开发源 | +| 真寻发布仓库 | https://github.com/Shu-Ying/zhenxun_plugin_farm.git | 真寻完整插件 | +| AstrBot 发布仓库 | https://github.com/Shu-Ying/astrbot_plugin_farm.git | AstrBot 完整插件 | +| NoneBot 发布仓库 | https://github.com/Shu-Ying/nonebot_plugin_farm.git | NoneBot 包及 PyPI 构建资料 | + +三个发布仓库已存在,不是空仓库,也不是 Git 子模块。 +本轮曾按用户要求完成 clone,随后用户要求停止并删除,三个本地副本 +及 .release-workspaces 已删除。不再 clone/fetch/pull/push。 +历史分支和提交记录保留在 repository-inventory.json,并标明已删除。 + +历史观察:三个远程默认分支均为 main;与源 Beta 的代码布局不同。 +因此未来不能直接覆盖 main 或假设旧 Beta 就等于远程稳定版。 +首次接管发布流程必须先核对各仓库现有功能、许可、兼容性和用户安装路径。 + +## 发布内容与目录 + +每个发布产物 = 同一主提交的共享核心 + 当前框架接入 + 对应依赖 ++ 必需资源 + 许可证/归属 + 来源清单。 +legacy、docs、tests、开发工具、其他框架入口、真实数据不进入安装包。 + +真寻仓库根保留其可被插件目录直接加载的布局;AstrBot 根保留 +main.py、metadata.yaml、配置描述和 requirements.txt 等宿主所需文件; +NoneBot 根为 pyproject.toml 加 nonebot_plugin_farm/ 模块。 +这些布局必须以真实宿主安装验证为准,不只检查文件名。 + +各插件私有包含 _vendor/farm_core;共享核心内部使用相对导入。 +NoneBot wheel 明确包含资源;不能假设 zip 的相对目录在 wheel 内 +也自动存在。分别验证仓库安装、ZIP 安装和 wheel 安装。 + +## 建议发布流程 + +1. 选定主仓库提交或受保护版本标签,计算统一版本和资源版本。 +2. 对各目标执行文件白名单组装,不从开发目录无差别复制。 +3. 运行核心测试、迁移、依赖边界检查及对应宿主加载/启停测试。 +4. 生成 ZIP/wheel、SHA-256、文件清单、构建环境与来源信息。 +5. 校验资源大小、许可证、无其他框架代码/依赖、无令牌和玩家数据。 +6. 为每个发布仓库生成可审查的候选差异;首次切换先 PR, + 经授权后发布。PR/推送/发布不由这份设计文档自动授权。 +7. 在发布仓库内用普通提交更新产物,不 force push,不改写历史。 +8. 提交安装内容和来源清单后,再创建指向同一提交的发布标签。 +9. 按目标发布到仓库/Release/PyPI,并记录各目标结果。 + +未来可使用 GitHub Actions;本轮未编写可执行发布工作流、未配置凭据。 +发布工作区使用隔离的临时目录;清理只允许精确列出的生成路径。 +保留目标仓库中的治理资料和人工维护文件,禁止无条件清空仓库。 + +## 版本、重试与回滚 + +首期建议核心和插件采用统一产品版本;目标元数据附 source_commit、 +target、resource_version、schema_version 和构建内容哈希。 +来源清单不能嵌入“包含清单本身的整个包哈希”形成循环依赖; +先列内容哈希,最终包哈希写独立校验附件。 + +跨仓库更新不是一个 Git 事务。为一次发布保存发布 ID 和目标状态; +部分失败只重试相同来源的失败目标,不重新构建不同内容冒充同版本。 +相同来源、版本和目标应生成相同文件内容;统一归档排序及时间元数据。 +已有标签和已上传 PyPI 版本不可覆盖,用新修复版本处理。 + +回滚插件二进制/源码不代表可以回滚数据库。 +只有 schema 向后兼容或恢复备份后才能回退;停止机器人并校验后操作。 +禁止用户通过退回旧包直接打开不兼容的新数据库。 + +## 权限与触发 + +GITHUB_TOKEN 限于当前仓库场景,跨仓库同步需另设明确授权; +建议使用仅获三个目标仓库权限的 GitHub App 安装令牌。 +不在配置文件内写 PAT、不把令牌放 Git URL,不在不可信 PR 中执行发布。 +构建可读权限与发布写权限分开,发布使用受保护环境和固定目标白名单。 +凭据由仓库 Secrets/环境提供,版本和目标必须校验。 + +## 资源体积与分发 + +本轮测得迁移基线 ZIP 为 26,084,694 字节,约 24.9 MiB; +这是尺寸探测,不是可安装发布包。 +AstrBot 当前发布文档列出的市场 ZIP 上限为 16 MB,因此直接打包全量 +旧资源不可行。优先审查未使用图片、无损优化和基础资源集; +如仍需外置资源,采用固定版本、HTTPS、哈希和大小上限、 +临时下载验证后原子安装,提供离线资源包。 +不默认开发版直连远程服务,不跟随 latest 获取未绑定版本的作物库。 + +必须决定首次离线可玩范围、远程资源不可用时的回退、资源包保留版本, +以及图片和字体的分发权属。资源 schema 也要跟随代码兼容矩阵。 + +## 官方依据 + +核对日期:2026-10-15;正式发布前重新验证。 + +- [AstrBot 发布说明](https://docs.astrbot.app/dev/star/plugin-publish.html): + 仓库元数据与市场 ZIP 体积要求。 +- [AstrBot 安装方式](https://docs.astrbot.app/use/plugin.html): + 仓库链接或 ZIP 文件安装。 +- [NoneBot 发布说明](https://nonebot.dev/docs/developer/plugin-publishing): + Python 包、PyPI 与官方商店发布路径。 +- [GitHub Actions 身份验证](https://docs.github.com/en/actions/tutorials/authenticate-with-github_token): + GITHUB_TOKEN 权限与其他授权方式。 diff --git a/docs/05-migration.md b/docs/05-migration.md new file mode 100644 index 0000000..6f5d019 --- /dev/null +++ b/docs/05-migration.md @@ -0,0 +1,61 @@ +# 旧代码与数据迁移 + +## 本轮实际同步 + +源:D:/Work/zhenxun_plugin_farm,Beta 分支, +提交 b015c6c1997f146f651b677382980d338a306bb2。 +复制工作区中受版本管理的文件,不复制 .git、未跟踪的工具安装目录。 +源 .gitignore 含上轮 Comet 规则,未复制;新主仓库使用自己的忽略策略。 + +目的地:legacy/zhenxun_plugin_farm。827 个文件、35 个 Python 文件、 +静态配置、HTML、图片以及两个仅含 plant/sqlite_sequence 表的作物库。 +两库只读 quick_check 均为 ok,未复制运行中的 farm.db 或玩家备份。 +静态资源是否全有合法分发授权尚未确认。 + +唯一源码差异:utils/request.py 的硬编码服务令牌改为读取 +FARM_SERVICE_TOKEN,未把原值复制到新仓库。 +来源哈希、复制哈希及差异说明见 legacy-manifest.json。 +原项目未修改,服务端令牌轮换需另行处理。 + +## 旧模块复用地图 + +| 旧位置 | 新去向 | 迁移方式 | +|---|---|---| +| command.py、根 __init__.py | integrations/zhenxun | 保留用户指令契约,重写生命周期和参数适配 | +| core/farm.py、core/shop.py | application、domain | 按用例提取,先修计算和交易缺陷 | +| core/database | infrastructure/sqlite | 明确 schema 与事务所有权,不直接照搬 | +| core/player | 领域模型/查询模型 | 首期移除余额权威缓存,不移植后台线程池 | +| utils/darw、HTML | presentation/资源 | 去除真寻 BuildImage 依赖,支持文本降级 | +| utils/request、utils/json | resources | 配置校验、版本固定、下载原子性 | +| event | 提交后副作用 | 逐个核对必要用途,不先移植通用信号层 | +| core/activity/activity.py、effect.py | 后续玩法候选 | 隔离加载失败,不接入首版 | +| resource/db | 版本化作物目录 | 区分内置只读目录与可写玩家数据库 | + +## 真实用户数据迁移建议 + +当前没有读写任何真实玩家库,以下尚未实施: + +1. 盘点实际部署版本、schema、来源平台、玩家数量和货币含义。 +2. 停写并备份,记录 schema、文件哈希和备份位置;备份不入 Git。 +3. 使用副本进行只读预检:主键、重复、负数、孤儿地块、未知作物、 + 作物成熟时间、锁定、签到日期、币种和数值范围。 +4. 明确旧裸 UID 到新身份命名空间的映射,不自动跨平台合并。 +5. 版本化迁移脚本写入新数据库,保存 migration_id 和 schema_version。 +6. 校验用户数、各币种合计、种子/作物数量、地块数及抽样业务状态, + 对每一项转换或舍弃生成报告;再次执行不得重复导入。 +7. 在目标框架演练最小玩法闭环、时区与资源加载,再切换数据目录。 +8. 若失败,停写后恢复旧程序与原备份,不让两个版本并行写同一数据库。 + +旧代码存在余额和经验重复增加,无法仅凭当前余额还原“正确历史值”。 +是否保留已有资产、重置、补偿或人工对账必须由用户明确决定, +不在迁移脚本中暗自纠正或清零。 + +## 首次发布仓库接管 + +当前本地 Beta 基线不等于三个发布仓库 main。 +未来需要取得重新拉取授权后,对比现有功能和依赖,记录有价值的框架 +接入代码与差异,再决定复用方式。不能本轮默认把远程现有代码覆盖成 +Beta,也不能把已有 AstrBot/NoneBot 实现宣称已经合并进新主仓库。 + +发布仓库地址已纳入设计,检出已按用户要求删除。仅迁移基线保留在 +主仓库,主仓库没有 Git 子模块和发布仓库副本。 diff --git a/docs/06-code-review.md b/docs/06-code-review.md new file mode 100644 index 0000000..331c0c5 --- /dev/null +++ b/docs/06-code-review.md @@ -0,0 +1,62 @@ +# 源码审查 + +日期:2026-10-15。范围:旧 Beta 迁移基线的关键用例、数据层、 +玩家缓存、初始化、资源请求和未完成的活动模块。 +结论:有功能拆分基础,但交易边界、状态权威、错误传播和分层不足, +不建议直接在此结构上继续扩展跨框架玩法。 + +## 证据与限制 + +代码图提供符号和调用线索,覆盖检查报告 metadata_changed; +以下结论均回到源码核对,不以图的缺边证明代码不存在。 +链接指向复制基线,通常与源行号一致;request.py 已移除令牌。 +本轮语法检查和两个模块隔离加载见 baseline-checks.json。 +没有启动真实宿主、执行完整插件导入、联网访问旧服务或开展并发压测。 + +P1:数据、资产或主要功能错误,应在新核心实施前处理。 +P2:功能契约或维护可靠性问题。风险项与已证实缺陷分别标识。 + +## 已确认缺陷 + +| 编号 | 等级 | 证据 | 触发与影响 | 修复方向 | +|---|---|---|---|---| +| F01 | P1 | [shop.py:241](../legacy/zhenxun_plugin_farm/core/shop.py#L241)、[player.py:62](../legacy/zhenxun_plugin_farm/core/player/player.py#L62) | 出售把原余额加收入传给增量接口;100+20 得到 220 | 收益只加一次;交易内更新 | +| F02 | P1 | [farm.py:327](../legacy/zhenxun_plugin_farm/core/farm.py#L327)、[player.py:119](../legacy/zhenxun_plugin_farm/core/player/player.py#L119) | 收获把原经验再次传给增量接口,重复累计 | 清晰区分增量与新值 | +| F03 | P1 | [farm.py:262](../legacy/zhenxun_plugin_farm/core/farm.py#L262) | 循环中对累计经验应用当前土地加成,前面经验被再次放大 | 各地块独立计算后相加;交换地块顺序测试 | +| F04 | P1 | [user.py:102](../legacy/zhenxun_plugin_farm/core/database/user.py#L102) | updatePoint 丢弃底层失败结果,直接 True,内存可能领先落库 | 原样传播失败,提交后失效缓存 | +| F05 | P1 | [player.py:27](../legacy/zhenxun_plugin_farm/core/player/player.py#L27)、[tool.py:25](../legacy/zhenxun_plugin_farm/utils/tool.py#L25)、[command.py:53](../legacy/zhenxun_plugin_farm/command.py#L53) | 未注册玩家被缓存为空 dict,创建数据库记录后不刷新,后续判断仍未注册 | 不缓存无效玩家;注册提交后刷新 | +| F06 | P1 | [shop.py:161](../legacy/zhenxun_plugin_farm/core/shop.py#L161) | 扣款与发种分离,忽略扣款结果,发种失败不回滚 | 应用层一个事务覆盖交易 | +| F07 | P1 | [userSign.py:158](../legacy/zhenxun_plugin_farm/core/database/userSign.py#L158)、[userSign.py:229](../legacy/zhenxun_plugin_farm/core/database/userSign.py#L229) | 签到记录先提交,奖励在其后发放,中断会已签到未到账 | 唯一签到与奖励在同一事务,返回原操作结果 | +| F08 | P2 | [shop.py:194](../legacy/zhenxun_plugin_farm/core/shop.py#L194) | 只在全部出售检查锁定,指定作物分支绕开检查 | 统一可消耗库存规则 | +| F09 | P2 | [activity.py:46](../legacy/zhenxun_plugin_farm/core/activity/activity.py#L46)、[effect.py:46](../legacy/zhenxun_plugin_farm/core/activity/effect.py#L46) | 隔离加载分别因 ActivityType、Player 未定义而失败 | 标为未完成功能,不进入首版;不能仅以语法判断可用 | +| F10 | P1 | [request.py:22](../legacy/zhenxun_plugin_farm/utils/request.py#L22) | 源代码有硬编码服务令牌,任意持有源码者可取得该值 | 本轮副本已改环境变量;服务端轮换仍未完成 | +| F11 | P2 | [config.py:90](../legacy/zhenxun_plugin_farm/utils/config.py#L90)、[shop.py:243](../legacy/zhenxun_plugin_farm/core/shop.py#L243) | 批量出售选择带 name 占位符的文案却未传 name,资产更新后可能格式化失败 | 统一结果模型,先验证模板参数并用例覆盖 | + +F01/F02 的例子来自源码算式,不是完整机器人运行结果。 +F06/F07 的失败后果是条件性推断,尚未做数据库故障注入。 +F09 已做不依赖宿主的模块定义加载,不能据此声称主插件必然启动失败。 +F10 不在报告或代码中重复原令牌。 + +## 设计问题与待验证风险 + +| 编号 | 类别 | 证据与判断 | 建议验证/整改 | +|---|---|---|---| +| R01 | 并发风险 | [database.py:125](../legacy/zhenxun_plugin_farm/core/database/database.py#L125) 的 BEGIN/COMMIT 无业务事务协调;[player.py:62](../legacy/zhenxun_plugin_farm/core/player/player.py#L62) 从内存读改写 | 同一用户并发购买/收获、不同用户共享连接、任务取消测试 | +| R02 | 分层 | [userSoil.py:412](../legacy/zhenxun_plugin_farm/core/database/userSoil.py#L412) 决定星级;[userSign.py:257](../legacy/zhenxun_plugin_farm/core/database/userSign.py#L257) 绘图 | 规则上移领域/应用,绘图独立 | +| R03 | 生命周期 | [dbService.py:51](../legacy/zhenxun_plugin_farm/core/dbService.py#L51) 并发安排 init/initDB,不检查 bool 便标记 ready | 明确启动顺序和失败条件;数据库不可用时不得就绪 | +| R04 | 缓存 | [playerPool.py:67](../legacy/zhenxun_plugin_farm/core/player/playerPool.py#L67) 的线程锁只保护字典,不保护返回玩家对象的异步操作 | 数据库为权威,先移除余额写缓存,再按性能需要缓存查询 | +| R05 | 可维护性 | CDBService 和 CDBServiceLocator 两套服务入口,工具层反向加载业务对象 | 保留一个启动组装位置,明确依赖,不机械保留全局单例 | +| R06 | 外部资源 | [request.py:65](../legacy/zhenxun_plugin_farm/utils/request.py#L65) 下载直接覆盖,未验证固定版本和内容哈希 | HTTPS、大小/路径校验、暂存验证、原子切换和最后有效版本 | +| R07 | 扩展机制 | [event.py:60](../legacy/zhenxun_plugin_farm/event/event.py#L60) 事件槽吞异常后继续 | 必需状态更新不依赖这种可失败通知;事件限定提交后副作用 | + +“农场下阶段”虽未见入口管理员检查,但 nextPhase 有调试开关且当前 +默认 False;本轮不将其认定为默认可利用的权限漏洞。 +未来调试功能应显式授权且不进入普通用户命令集。 + +## 复核与测试优先级 + +先写行为级回归:出售余额、收获经验、首次注册立即使用、 +交易失败不改变任一资产、签到不重复发奖、指定与批量出售锁定一致。 +再补并发、时间、迁移和三宿主加载测试。 +本轮没有修复 F01–F09/F11,也没有宣布审查通过可发布。 +迁移副本唯一安全修正为 F10,旧项目仍保持原样。 diff --git a/docs/07-decisions.md b/docs/07-decisions.md new file mode 100644 index 0000000..af9e271 --- /dev/null +++ b/docs/07-decisions.md @@ -0,0 +1,41 @@ +# 待确认与补充问题 + +这些事项会改变用户资产、玩法和部署结果。文档中的建议不是已确认需求; +本轮初始化和保全不依赖它们,正式业务实现前需收敛关键项。 + +| 决策 | 建议起点 | 为什么要确认 | +|---|---|---| +| 农场归属 | 每个独立部署自有数据;群共享范围明确配置 | 决定注册唯一键、偷菜范围与迁移 | +| 多框架关系 | 先支持分别部署和迁移,不自动在线互通 | 联机会改变存储与服务架构 | +| 账号迁移 | 显式平台命名空间与人工确认映射 | QQ 官方标识与 OneBot ID 不宜自动合并 | +| 存量资产 | 默认保留并记录异常,另议补偿 | 旧逻辑有增发,无法从余额准确逆推 | +| 外部金币 | 真寻保留可选接入;其他框架默认关闭 | 外部钱包无法由本地事务保证原子性 | +| 点券和星级 | 先核对现有用途、成本与升级公式 | 涉及经济平衡与数据兼容 | +| 签到资源 | 首先保证内置/本地配置可用,联网更新可选 | 远程服务停机不应让基本玩法不可用 | +| 资源分发 | 精简基础资源;需要时使用固定版本扩展包 | 旧资源 ZIP 超 AstrBot 16 MB 市场限制 | +| 渲染 | 文本必备,图片可选且失败降级 | 宿主、字体、浏览器依赖和性能不同 | +| 兼容基线 | 保留旧指令清单;Python/宿主版本经矩阵实测确定 | 旧 README 的 3.10+ 不等于三框架共同最低版本 | +| 发布顺序 | 真寻先稳定,之后普通 NoneBot、AstrBot | 利用现有宿主验证闭环,控制变更范围 | +| 发布仓库 | 使用给出的三个现有仓库,接管前比较现有代码 | 三仓库不为空,不能直接覆盖 | +| 主仓库远程 | 用户后续提供独立 farm 地址 | 本轮只建本地 Git,不误用发布仓库 | +| 发布授权 | 首次候选 PR 审查,稳定后再议自动发布 | 本轮未授权远程覆盖、推送或发布 | +| 跨平台 OS | 建议 Windows + Linux;macOS 有需求再验收 | 路径大小写、字体、浏览器和时区需分别测试 | +| 素材许可证 | 核对图片、字体、HTML 和借用工具来源 | 代码 GPLv3 不自动证明所有素材可分发 | +| 数据运维 | 定期备份、保留策略、恢复演练和脱敏诊断 | 游戏资产需要可恢复性和隐私保护 | + +## 容易遗漏的技术约束 + +- 从旧仓库自动更新到新布局时,插件安装器是否删除旧文件; + 旧入口残留可能重复加载,必须进行“旧版→新版”真实升级演练。 +- 多目标发布可能部分成功,需要按目标重试和状态清单。 +- 插件降级不等于 schema 降级;必须定义最低可读写 schema。 +- 网络重试、平台重复投递、图片发送失败不能再次发奖或扣款。 +- 资源目录只读部署场景必须支持,把可写缓存放宿主数据目录。 +- 同一宿主同时安装相关插件时,模块名称和第三方依赖可能冲突; + 插件私有打包只解决前者。 +- Python、宿主框架、数据库 schema、作物规则和资源版本分别记录, + 不混用一个远程浮点版本比较所有兼容关系。 +- 发布仓库里的现有 star、issue、tag 和许可证要保留;不能 force push。 +- 子仓库是概念上的发布仓库,不使用 git submodule,也不把本地克隆 + 提交进主仓库。 +- CI 中的密钥不写源码;旧源码中暴露的服务令牌需服务端轮换。 diff --git a/docs/08-validation.md b/docs/08-validation.md new file mode 100644 index 0000000..94eac6e --- /dev/null +++ b/docs/08-validation.md @@ -0,0 +1,48 @@ +# 本轮验证与交付边界 + +日期:2026-10-15。执行 Python:3.12.14;未安装或启动三种宿主。 +新工具还以 Python 3.10 语法规则解析旧代码;这不代表三框架共同支持 +Python 3.10,最低运行版本需在后续兼容矩阵中确认。 + +## 已完成 + +| 检查 | 结果 | 证据 | +|---|---|---| +| Git 初始化 | main 分支,本地仓库,无远程、无提交或推送 | Git 状态;repository-checks.json | +| 迁移完整性 | 827 文件均匹配复制 SHA-256 | scripts/check_baseline.py | +| 来源保持 | 827 文件的旧项目来源哈希未变化 | repository-checks.json | +| Python 语法 | 35 个基线文件通过 | baseline-checks.json、校验脚本 | +| JSON 语法 | 4 个基线配置/版本文件通过 | 校验脚本 | +| 静态数据库 | 两库 quick_check=ok,仅 plant/sqlite_sequence 表 | 校验脚本 | +| 未完成活动模块 | 隔离加载确认两个 NameError;作为已知缺陷记录 | baseline-checks.json、F09 | +| 忽略规则 | 29 类路径均符合预期;827 基线文件未误屏蔽 | repository-checks.json | +| 新工具语法/行长 | 通过;无超 80 字符行 | repository-checks.json | +| 资源 ZIP 测量 | 26,084,694 字节;仅体积探测,未生成安装包 | baseline-checks.json | +| 本地克隆删除 | 三个副本和空父目录均已删除,无子模块 | repository-checks.json | +| 令牌处理 | 迁移副本从环境变量读取;未复制原令牌 | legacy-manifest.json 的唯一差异 | +| 换行保护 | legacy/** -text,避免 Git 检出改变基线字节 | .gitattributes | + +本地文档链接复核通过,无缺失目标。校验工具的错误路径也已验证: +模拟 827 个哈希失配均被检测;越界的清单目的路径被拒绝。源码图覆盖存在 metadata_changed 提示, +结论均以直接读取的源码为依据,不把代码图的缺边当作无调用证据。 + +## 明确未完成 + +- 旧业务缺陷修复、新核心、多框架插件入口和实际宿主加载。 +- 真实数据库事务故障注入、并发压测和全部玩法回归。 +- 真实玩家数据库迁移、账号绑定、跨框架数据共享与外部金币对账。 +- 跨仓库自动发布、Actions 权限配置、PyPI、Release、商店审核。 +- 主仓库远程设置、首次提交、推送或覆盖任一发布仓库。 +- 原服务端令牌轮换,素材和字体授权清单、资源瘦身。 + +## 后续复现 + +```text +python scripts/check_baseline.py +git status --short +git check-ignore -v runtime/farm.db +git check-ignore -v .release-workspaces/example/.git/config +``` + +两条 check-ignore 用于观察忽略规则;路径无需真实存在。 +脚本不导入插件、不发网络请求、不读玩家数据库。 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..77026e4 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# 文档索引 + +记录日期:2026-10-15。状态:已形成设计草案,待关键产品决策确认; +业务重构、多框架接入、发布流水线和真实数据迁移尚未实施。 + +| 文档 | 用途 | +|---|---| +| [01-roadmap.md](01-roadmap.md) | 长期目标、实施顺序、里程碑与验收 | +| [02-architecture.md](02-architecture.md) | 分层、目录、依赖、接入与接口设计 | +| [03-business-rules.md](03-business-rules.md) | 身份、货币、库存、作物、事务与幂等 | +| [04-release-design.md](04-release-design.md) | 一个主仓库、三个发布仓库、分包与同步 | +| [05-migration.md](05-migration.md) | 旧代码复用、数据升级、兼容与回滚 | +| [06-code-review.md](06-code-review.md) | 源码证据、缺陷等级、验证状态与修复方向 | +| [07-decisions.md](07-decisions.md) | 需要补充的产品和运维决定 | +| [08-validation.md](08-validation.md) | 本轮实际验证及尚未验证的范围 | +| [legacy-manifest.json](legacy-manifest.json) | 827 个复制文件的来源与 SHA-256 | +| [repository-checks.json](repository-checks.json) | 忽略规则、文档链接、工具错误路径与清理结果 | +| [baseline-checks.json](baseline-checks.json) | 语法、隔离加载、ZIP 体积探测结果 | +| [repository-inventory.json](repository-inventory.json) | 曾克隆仓库的历史元数据;本地副本已按用户要求删除 | +| [task_plan.md](task_plan.md) | 本轮任务及完成状态 | +| [findings.md](findings.md) | 调查发现 | +| [progress.md](progress.md) | 执行记录 | + +## 阅读与使用约定 + +- “已确认”必须有源码、命令或文档来源;“建议”不能当作已接受需求。 +- 文档中的目标结构是设计,不表示对应代码已实现。 +- 发布仓库是分发目标,不是 Git 子模块;各框架使用相互独立的插件包。 +- 主仓库远程地址尚未提供;不将任一插件发布仓库误设为主仓库 origin。 +- 用户已撤回拉取要求,且要求删除本地克隆;三个本地检出已删除,不再访问远程。 +- 本轮仅修正迁移副本中的硬编码凭据;业务缺陷记录在审查报告,没有隐式修复。 diff --git a/docs/baseline-checks.json b/docs/baseline-checks.json new file mode 100644 index 0000000..2d92ba4 --- /dev/null +++ b/docs/baseline-checks.json @@ -0,0 +1,20 @@ +{ + "python": "3.12.14", + "python_syntax_files": 35, + "syntax_errors": [], + "isolated_module_probes": [ + { + "path": "core/activity/activity.py", + "result": "NameError", + "detail": "name 'ActivityType' is not defined" + }, + { + "path": "core/activity/effect.py", + "result": "NameError", + "detail": "name 'Player' is not defined" + } + ], + "baseline_zip_bytes": 26084694, + "zip_is_installable_plugin": false, + "note": "Size probe only. No framework, scheduler, network or player database started." +} diff --git a/docs/findings.md b/docs/findings.md new file mode 100644 index 0000000..8e8849f --- /dev/null +++ b/docs/findings.md @@ -0,0 +1,27 @@ +# 调查发现 + +## 已确认事实 + +- 新主目录 D:/Work/farm 起初为空,现已本地初始化为 main,无远程。 +- 源旧项目 Beta 提交 b015c6c1997f146f651b677382980d338a306bb2。 +- 源业务文件本轮未修改;复制 827 文件,35 个 Python 文件。 +- 两个作物数据库只有 plant 和 sqlite_sequence 表,quick_check 正常。 +- 基线 ZIP 约 24.9 MiB,超过 AstrBot 发布文档所述市场包 16 MB 上限。 +- 两个活动模块虽能语法解析,但隔离加载分别发生未定义类型 NameError。 +- 硬编码服务令牌未复制进新仓库,副本改读 FARM_SERVICE_TOKEN。 +- 出售、经验、失败返回、注册缓存等确定性问题见审查 F01–F11。 +- 三个用户给出的仓库都已有 main 历史,与本地 Beta 布局不同; + 已按用户最新要求删除本地克隆,只保留历史元数据和地址。 + +## 设计建议 + +- 主仓库唯一开发源,每个框架发布包携带私有、同版本共享核心。 +- 领域/应用/存储/展示/接入职责清晰,首期不建立复杂微服务。 +- 数据库为业务权威,应用用例拥有事务,操作具备幂等标识和流水。 +- 首期独立部署,跨框架在线共享数据是单独需求。 +- 发布使用白名单和可审查候选,不直接清空三个已有发布仓库。 + +## 待确认 + +身份和群共享范围、存量资产处理、外部经济、资源分发、最低宿主版本、 +主仓库远程地址及发布授权,详见 07-decisions.md。 diff --git a/docs/integrity-checks.json b/docs/integrity-checks.json new file mode 100644 index 0000000..a383c28 --- /dev/null +++ b/docs/integrity-checks.json @@ -0,0 +1,26 @@ +{ + "status": "passed", + "files": 827, + "python_syntax_files": 35, + "json_files": 4, + "catalogues": [ + { + "name": "plant.db", + "quick_check": "ok", + "tables": [ + "plant", + "sqlite_sequence" + ] + }, + { + "name": "plant-test.db", + "quick_check": "ok", + "tables": [ + "plant", + "sqlite_sequence" + ] + } + ], + "errors": [], + "scope": "integrity and syntax only; no host or gameplay verified" +} diff --git a/docs/legacy-manifest.json b/docs/legacy-manifest.json new file mode 100644 index 0000000..9d19ef7 --- /dev/null +++ b/docs/legacy-manifest.json @@ -0,0 +1,5806 @@ +{ + "schema": "farm.legacy-baseline.v1", + "date": "2026-10-15", + "source_repository": "https://github.com/Shu-Ying/zhenxun_plugin_farm", + "source_branch": "Beta", + "source_commit": "b015c6c1997f146f651b677382980d338a306bb2", + "snapshot": "tracked working-tree files", + "destination": "legacy/zhenxun_plugin_farm", + "excluded": [ + { + "path": ".gitignore", + "reason": "Source has Comet initialization rules; farm has its own root ignore policy." + } + ], + "files": [ + { + "path": "LICENSE", + "source_sha256": "81cbae84a29ce7e770bf2bc7b178e50bda0ce8de6067aba661b0bc7b05b562f8", + "copied_sha256": "81cbae84a29ce7e770bf2bc7b178e50bda0ce8de6067aba661b0bc7b05b562f8", + "bytes": 35821, + "modification": null + }, + { + "path": "README.md", + "source_sha256": "f9e517c2725fa610b6526497929ae834e814438df0f9892a87a85d0e646eb814", + "copied_sha256": "f9e517c2725fa610b6526497929ae834e814438df0f9892a87a85d0e646eb814", + "bytes": 4854, + "modification": null + }, + { + "path": "__init__.py", + "source_sha256": "ab75747fe9c667d7a56908367d8e62b37778d2333525eece1f3052b42ae49494", + "copied_sha256": "ab75747fe9c667d7a56908367d8e62b37778d2333525eece1f3052b42ae49494", + "bytes": 4972, + "modification": null + }, + { + "path": "command.py", + "source_sha256": "296ad21a6b7be4023c6ecb38bafedc331a806622c33994c929ffecc14d0f4c9e", + "copied_sha256": "296ad21a6b7be4023c6ecb38bafedc331a806622c33994c929ffecc14d0f4c9e", + "bytes": 21416, + "modification": null + }, + { + "path": "config/item.json", + "source_sha256": "4faafd92b3b48ed894590eca7cc131a0aff97d7ca7d18579f151f764ce4ccc6d", + "copied_sha256": "4faafd92b3b48ed894590eca7cc131a0aff97d7ca7d18579f151f764ce4ccc6d", + "bytes": 417, + "modification": null + }, + { + "path": "config/level.json", + "source_sha256": "044c97a2f9b2a8a3bfe435fe232ffcb6acb4a20fae5a1562114ec8f90a3ae210", + "copied_sha256": "044c97a2f9b2a8a3bfe435fe232ffcb6acb4a20fae5a1562114ec8f90a3ae210", + "bytes": 3387, + "modification": null + }, + { + "path": "config/soil.json", + "source_sha256": "fcab73cd8b5dda01ab905d3e48d6a7df92d9f89d9288e6c0122ff70bab5cb5cf", + "copied_sha256": "fcab73cd8b5dda01ab905d3e48d6a7df92d9f89d9288e6c0122ff70bab5cb5cf", + "bytes": 9225, + "modification": null + }, + { + "path": "core/__init__.py", + "source_sha256": "8967b12a9d697b2f268ca1a8f08ee60d76168cc283fe8141d976a0caeb304355", + "copied_sha256": "8967b12a9d697b2f268ca1a8f08ee60d76168cc283fe8141d976a0caeb304355", + "bytes": 586, + "modification": null + }, + { + "path": "core/activity/activity.py", + "source_sha256": "8383c24d1b3ca352e9b52ff221106fac26798214087276a8be265fcea5e3b25a", + "copied_sha256": "8383c24d1b3ca352e9b52ff221106fac26798214087276a8be265fcea5e3b25a", + "bytes": 4097, + "modification": null + }, + { + "path": "core/activity/effect.py", + "source_sha256": "1e234ae44e91a8f8bf55444d6260e5c6b98577dca0d362ad2c1db5ee6dd0f0c2", + "copied_sha256": "1e234ae44e91a8f8bf55444d6260e5c6b98577dca0d362ad2c1db5ee6dd0f0c2", + "bytes": 2977, + "modification": null + }, + { + "path": "core/activity/sign_in.py", + "source_sha256": "cb6e8e4de6ee277d7900a7d135f2b36de32aa417a0c6656a98b7bb8beeffb3dc", + "copied_sha256": "cb6e8e4de6ee277d7900a7d135f2b36de32aa417a0c6656a98b7bb8beeffb3dc", + "bytes": 5469, + "modification": null + }, + { + "path": "core/database/__init__.py", + "source_sha256": "c38856b50105a50816e0d3b9bb4c0cd341c3ceb94dadded1b5d3df0982bfe710", + "copied_sha256": "c38856b50105a50816e0d3b9bb4c0cd341c3ceb94dadded1b5d3df0982bfe710", + "bytes": 650, + "modification": null + }, + { + "path": "core/database/database.py", + "source_sha256": "eab2964ad0c14ff824d89a8ca83fc0341e8acac6183448fd9f1fecea30bbcc56", + "copied_sha256": "eab2964ad0c14ff824d89a8ca83fc0341e8acac6183448fd9f1fecea30bbcc56", + "bytes": 17377, + "modification": null + }, + { + "path": "core/database/dbServiceLocator.py", + "source_sha256": "8d5e44fc77a2754b4f70c4bcc6c04a0ca758aeb5341897555ada170e2218c173", + "copied_sha256": "8d5e44fc77a2754b4f70c4bcc6c04a0ca758aeb5341897555ada170e2218c173", + "bytes": 2149, + "modification": null + }, + { + "path": "core/database/plant.py", + "source_sha256": "582d9ca28cec22076d1f03d7c9cedabc934372300e67d6070e6612dac863ac36", + "copied_sha256": "582d9ca28cec22076d1f03d7c9cedabc934372300e67d6070e6612dac863ac36", + "bytes": 9071, + "modification": null + }, + { + "path": "core/database/user.py", + "source_sha256": "31888cc892ee854c95755301066eff9fc013a7111a26a19632a5fa521fab0feb", + "copied_sha256": "31888cc892ee854c95755301066eff9fc013a7111a26a19632a5fa521fab0feb", + "bytes": 5928, + "modification": null + }, + { + "path": "core/database/userItem.py", + "source_sha256": "b04f9b75da1b66705dec3858d450319d4df9a13fc629fe79e144f44058b14f1b", + "copied_sha256": "b04f9b75da1b66705dec3858d450319d4df9a13fc629fe79e144f44058b14f1b", + "bytes": 5466, + "modification": null + }, + { + "path": "core/database/userPlant.py", + "source_sha256": "55878e359b246a985f9a552f7dd5aaf9cfe1f1b0080a84cc27467abaf7bc80b9", + "copied_sha256": "55878e359b246a985f9a552f7dd5aaf9cfe1f1b0080a84cc27467abaf7bc80b9", + "bytes": 7085, + "modification": null + }, + { + "path": "core/database/userPlantCount.py", + "source_sha256": "09f0845e77a0d974ceca1b042bfda779cb21ec4345b6a99507551403264579ef", + "copied_sha256": "09f0845e77a0d974ceca1b042bfda779cb21ec4345b6a99507551403264579ef", + "bytes": 4855, + "modification": null + }, + { + "path": "core/database/userSeed.py", + "source_sha256": "d4b50f92932febb579e14dc2729f91e702da5b297f186cc654ee20ec52299050", + "copied_sha256": "d4b50f92932febb579e14dc2729f91e702da5b297f186cc654ee20ec52299050", + "bytes": 7102, + "modification": null + }, + { + "path": "core/database/userSign.py", + "source_sha256": "aaa15f7343eaf839a11439867a6f4dc3f2f89b00e6efa3728bb3203a8cb9fbd4", + "copied_sha256": "aaa15f7343eaf839a11439867a6f4dc3f2f89b00e6efa3728bb3203a8cb9fbd4", + "bytes": 11372, + "modification": null + }, + { + "path": "core/database/userSoil.py", + "source_sha256": "7a56081a757025b4a23098b64b471a475e067a2a8832770b59d6a3efe15d440e", + "copied_sha256": "7a56081a757025b4a23098b64b471a475e067a2a8832770b59d6a3efe15d440e", + "bytes": 18800, + "modification": null + }, + { + "path": "core/database/userSteal.py", + "source_sha256": "03c70968f77bd41213a86098a8a1d9408da73d1159646bf63df7ef4cb371fde5", + "copied_sha256": "03c70968f77bd41213a86098a8a1d9408da73d1159646bf63df7ef4cb371fde5", + "bytes": 8095, + "modification": null + }, + { + "path": "core/dbService.py", + "source_sha256": "c6cef4a84d5d56bb68c54668f4d74c0b9632afa0f9cdb0641d90adc20f31c9ac", + "copied_sha256": "c6cef4a84d5d56bb68c54668f4d74c0b9632afa0f9cdb0641d90adc20f31c9ac", + "bytes": 2774, + "modification": null + }, + { + "path": "core/farm.py", + "source_sha256": "5596b648c046a6cd1430b4934752e32a446a6e27faabda867d437652dab22d99", + "copied_sha256": "5596b648c046a6cd1430b4934752e32a446a6e27faabda867d437652dab22d99", + "bytes": 31298, + "modification": null + }, + { + "path": "core/help.py", + "source_sha256": "f90c3e8ca2bca3708a4776a55f03940943b5cd1781be5da05a18d4ba57c74419", + "copied_sha256": "f90c3e8ca2bca3708a4776a55f03940943b5cd1781be5da05a18d4ba57c74419", + "bytes": 1246, + "modification": null + }, + { + "path": "core/player/__init__.py", + "source_sha256": "203e963308eda0ee621c664138a99ff0b1f78e72fab5696ba1699ef22134d7a9", + "copied_sha256": "203e963308eda0ee621c664138a99ff0b1f78e72fab5696ba1699ef22134d7a9", + "bytes": 106, + "modification": null + }, + { + "path": "core/player/player.py", + "source_sha256": "89b40650df41b09670c7762282120423a50b9ef7d96c82a9fc7981acf96b1cef", + "copied_sha256": "89b40650df41b09670c7762282120423a50b9ef7d96c82a9fc7981acf96b1cef", + "bytes": 5679, + "modification": null + }, + { + "path": "core/player/playerPool.py", + "source_sha256": "bd5e381d93a1180f02605dde2848ad517a2e54361d0fedec302ecb0e307478a1", + "copied_sha256": "bd5e381d93a1180f02605dde2848ad517a2e54361d0fedec302ecb0e307478a1", + "bytes": 6770, + "modification": null + }, + { + "path": "core/shop.py", + "source_sha256": "456e430cd01bc2cca7fdd7d690728dea53aab02a8c12c7446d3f959904f6b623", + "copied_sha256": "456e430cd01bc2cca7fdd7d690728dea53aab02a8c12c7446d3f959904f6b623", + "bytes": 8452, + "modification": null + }, + { + "path": "event/__init__.py", + "source_sha256": "e9d9b0530b1bb4c117f91fb421d7a5112057e7f7fad3de2909c88ae3ad0d47a3", + "copied_sha256": "e9d9b0530b1bb4c117f91fb421d7a5112057e7f7fad3de2909c88ae3ad0d47a3", + "bytes": 69, + "modification": null + }, + { + "path": "event/event.py", + "source_sha256": "62f94da47cdf009b3ae1645fbf23244d8ba1dc628b14253db036cae36245bb4f", + "copied_sha256": "62f94da47cdf009b3ae1645fbf23244d8ba1dc628b14253db036cae36245bb4f", + "bytes": 3475, + "modification": null + }, + { + "path": "log/log.md", + "source_sha256": "f42cbdcb1e148888144c6127bc3b66102dcea4bfc09afd998da33e9616d643c0", + "copied_sha256": "f42cbdcb1e148888144c6127bc3b66102dcea4bfc09afd998da33e9616d643c0", + "bytes": 2449, + "modification": null + }, + { + "path": "requirements.txt", + "source_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "copied_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "modification": null + }, + { + "path": "resource/1.png", + "source_sha256": "31b2b0ce463915133667e1abcd8731a1c812b6ee4d5ebf7f6af90deb042beab3", + "copied_sha256": "31b2b0ce463915133667e1abcd8731a1c812b6ee4d5ebf7f6af90deb042beab3", + "bytes": 2812486, + "modification": null + }, + { + "path": "resource/background/background.jpg", + "source_sha256": "5cb100bfc44128a168fbac2c6e56f9ce54c70a3c8a30be71ff8fcc38ce376f99", + "copied_sha256": "5cb100bfc44128a168fbac2c6e56f9ce54c70a3c8a30be71ff8fcc38ce376f99", + "bytes": 815935, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon15.png", + "source_sha256": "4981292818915af77660d7796af1f40c65b897e0a48beca4f655ee1d29818c61", + "copied_sha256": "4981292818915af77660d7796af1f40c65b897e0a48beca4f655ee1d29818c61", + "bytes": 38962, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon16.png", + "source_sha256": "1f0420c8a25f3b883f3518becbf59ae1dbe7965308ef7249a49eb37aeacb06ae", + "copied_sha256": "1f0420c8a25f3b883f3518becbf59ae1dbe7965308ef7249a49eb37aeacb06ae", + "bytes": 44959, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon17.png", + "source_sha256": "16e0f0544a50ecda64add8f861ac72baa9960d25e7b4f737375f34fd15b8598b", + "copied_sha256": "16e0f0544a50ecda64add8f861ac72baa9960d25e7b4f737375f34fd15b8598b", + "bytes": 47021, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon18.png", + "source_sha256": "e6e516fc536fbb23ce1b2b7115cc675b321817612ef5b129deefd3dc1266adc8", + "copied_sha256": "e6e516fc536fbb23ce1b2b7115cc675b321817612ef5b129deefd3dc1266adc8", + "bytes": 31296, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon19.png", + "source_sha256": "da374fcf96fc1f136d9fb523d8a3b1178747c0654d09eae81a2c455cca0878d8", + "copied_sha256": "da374fcf96fc1f136d9fb523d8a3b1178747c0654d09eae81a2c455cca0878d8", + "bytes": 34053, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon20.png", + "source_sha256": "0e52baab7ca6928f989b21f900b8c09c9130c3ce8857ac0712154918846fed60", + "copied_sha256": "0e52baab7ca6928f989b21f900b8c09c9130c3ce8857ac0712154918846fed60", + "bytes": 40102, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon22.png", + "source_sha256": "c6c464e92273cde8ae892a3c3a58858562a469ef664d7337656a9982360890c1", + "copied_sha256": "c6c464e92273cde8ae892a3c3a58858562a469ef664d7337656a9982360890c1", + "bytes": 39970, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon23.png", + "source_sha256": "d9a4f1fd1baffad2325dc35e8a43ca063ca05da733ac41d699ea7f458f0d0f5b", + "copied_sha256": "d9a4f1fd1baffad2325dc35e8a43ca063ca05da733ac41d699ea7f458f0d0f5b", + "bytes": 45520, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon24.png", + "source_sha256": "81632213ef4aa016c923ba1a195ba5f6bb6f8693a8d12ead72e52c8c5f80b246", + "copied_sha256": "81632213ef4aa016c923ba1a195ba5f6bb6f8693a8d12ead72e52c8c5f80b246", + "bytes": 48131, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon39.jpg", + "source_sha256": "0632301dcf42a86e788c949faab21b2d8bbc3a469c91a82b8776110f65a077e4", + "copied_sha256": "0632301dcf42a86e788c949faab21b2d8bbc3a469c91a82b8776110f65a077e4", + "bytes": 738027, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon40.png", + "source_sha256": "e7a93c0226de9097b4f826638da12358feb788bfea31b3a9b554c87cec180c7e", + "copied_sha256": "e7a93c0226de9097b4f826638da12358feb788bfea31b3a9b554c87cec180c7e", + "bytes": 786935, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon41.png", + "source_sha256": "8c13a9a5e46220656b3634e5c9e8745e1ff96cdaae9a32045092166fc5626ac4", + "copied_sha256": "8c13a9a5e46220656b3634e5c9e8745e1ff96cdaae9a32045092166fc5626ac4", + "bytes": 115003, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon42.png", + "source_sha256": "a47842267a9c41343808ae68ef81b2a0c8783006029be47e1f7019620804f774", + "copied_sha256": "a47842267a9c41343808ae68ef81b2a0c8783006029be47e1f7019620804f774", + "bytes": 191892, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon43.png", + "source_sha256": "8009fdceafebc7cddfbb32fc9c83343301a2fb08d3b7cb8845b86f4dc289bcd4", + "copied_sha256": "8009fdceafebc7cddfbb32fc9c83343301a2fb08d3b7cb8845b86f4dc289bcd4", + "bytes": 177513, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon44.png", + "source_sha256": "a6e99e4ba32a18b43585fa4ea0da430593b0c63b8e41d59f0e54cc66927f5291", + "copied_sha256": "a6e99e4ba32a18b43585fa4ea0da430593b0c63b8e41d59f0e54cc66927f5291", + "bytes": 100199, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon45.png", + "source_sha256": "5fd59bf168a670ad7cee8b553ebd3d6a8ff50ac9f2e74a34afecf63d2c28e3b3", + "copied_sha256": "5fd59bf168a670ad7cee8b553ebd3d6a8ff50ac9f2e74a34afecf63d2c28e3b3", + "bytes": 172131, + "modification": null + }, + { + "path": "resource/background/decorateIcon/DecorateIcon48.png", + "source_sha256": "867689ec50ef560b4b372a02ff0f6bd2430b01cd6543d681b484f04a9533fdd8", + "copied_sha256": "867689ec50ef560b4b372a02ff0f6bd2430b01cd6543d681b484f04a9533fdd8", + "bytes": 10951, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_1.jpg", + "source_sha256": "a3346953c2caeb4587da66046eb72b26ddc3120d8a03eb6d9fac3105d4876e02", + "copied_sha256": "a3346953c2caeb4587da66046eb72b26ddc3120d8a03eb6d9fac3105d4876e02", + "bytes": 900248, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_2.png", + "source_sha256": "188d506956cfff3e3d4e0847b227f1128deb5a9b58451a9b4726cfca4ecff148", + "copied_sha256": "188d506956cfff3e3d4e0847b227f1128deb5a9b58451a9b4726cfca4ecff148", + "bytes": 691756, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_3.png", + "source_sha256": "5cf49b7475f7559c92ac8a6ab572da39c68b51aafe8106f683c05e422e5cdbc7", + "copied_sha256": "5cf49b7475f7559c92ac8a6ab572da39c68b51aafe8106f683c05e422e5cdbc7", + "bytes": 113008, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_4.png", + "source_sha256": "5bcf66b8c24b385f690a3edc7c5cdf09e585f24594a243588ac60b634e14d804", + "copied_sha256": "5bcf66b8c24b385f690a3edc7c5cdf09e585f24594a243588ac60b634e14d804", + "bytes": 222335, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_5.png", + "source_sha256": "112675d95146b0ba0fe6a85ec8528e21ad4b3f786e653c512ca712f88c1c37cb", + "copied_sha256": "112675d95146b0ba0fe6a85ec8528e21ad4b3f786e653c512ca712f88c1c37cb", + "bytes": 180866, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_6.png", + "source_sha256": "53da880a0d1733b6c358e88a153925043a1a5f613a1d19e231ef50596410f4e6", + "copied_sha256": "53da880a0d1733b6c358e88a153925043a1a5f613a1d19e231ef50596410f4e6", + "bytes": 89434, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_autumn_7.png", + "source_sha256": "54d3e8333c5cbd828525d0a7eb6f1325783c08aa17a53b3e343801ca4637ba0f", + "copied_sha256": "54d3e8333c5cbd828525d0a7eb6f1325783c08aa17a53b3e343801ca4637ba0f", + "bytes": 141805, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_1.jpg", + "source_sha256": "85b8b1135801bcbd3789c06f7d99655ee4c229506313772ffda13c59c1daeb40", + "copied_sha256": "85b8b1135801bcbd3789c06f7d99655ee4c229506313772ffda13c59c1daeb40", + "bytes": 1007427, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_2.png", + "source_sha256": "e6642aee792e67d1ac0156836e18e399cbf8eb1201843e0d4e6efbc9a054560d", + "copied_sha256": "e6642aee792e67d1ac0156836e18e399cbf8eb1201843e0d4e6efbc9a054560d", + "bytes": 40734, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_3.png", + "source_sha256": "828237611364a567cb634f6a5384147197be8c53b3b6a1dc916a5651eea2d315", + "copied_sha256": "828237611364a567cb634f6a5384147197be8c53b3b6a1dc916a5651eea2d315", + "bytes": 18545, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_4.png", + "source_sha256": "eec209b03f25de33069f06a44431c60d7485321d2f36748d3d1112f34b65e890", + "copied_sha256": "eec209b03f25de33069f06a44431c60d7485321d2f36748d3d1112f34b65e890", + "bytes": 30017, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_5.png", + "source_sha256": "d8814b7fd81361480e53bcb5b166affeaaf9b84d7a54370921fa4e16dd527143", + "copied_sha256": "d8814b7fd81361480e53bcb5b166affeaaf9b84d7a54370921fa4e16dd527143", + "bytes": 26665, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_6.png", + "source_sha256": "fc4868215c771f0bb3552290c91e4e1fef26b19cb7b66d49b9411ce7cfe16992", + "copied_sha256": "fc4868215c771f0bb3552290c91e4e1fef26b19cb7b66d49b9411ce7cfe16992", + "bytes": 11038, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_7.png", + "source_sha256": "e8bcaa8daaec9e7f564c41f3150b308031691603b4910bc99e7be8b755bb6bdb", + "copied_sha256": "e8bcaa8daaec9e7f564c41f3150b308031691603b4910bc99e7be8b755bb6bdb", + "bytes": 32754, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_8.png", + "source_sha256": "da7a6a54d69cee5887fcce84e17167447aaf33e2c2213ae35c1f94e2c9f31a7e", + "copied_sha256": "da7a6a54d69cee5887fcce84e17167447aaf33e2c2213ae35c1f94e2c9f31a7e", + "bytes": 6803, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_bee_9.png", + "source_sha256": "f52e3817c5af2a56ccc492635e111932d352bebc54c7bc446d199f2895a4c196", + "copied_sha256": "f52e3817c5af2a56ccc492635e111932d352bebc54c7bc446d199f2895a4c196", + "bytes": 11106, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_1.jpg", + "source_sha256": "a8616f7e008125c868485186be104e58287c582cd86d7fdd2b314862932c9b40", + "copied_sha256": "a8616f7e008125c868485186be104e58287c582cd86d7fdd2b314862932c9b40", + "bytes": 933497, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_10.png", + "source_sha256": "f3cd7bb3ddcc7040da4c239a8df4b3125e26070369c99e5ea2fd6d19663c11b3", + "copied_sha256": "f3cd7bb3ddcc7040da4c239a8df4b3125e26070369c99e5ea2fd6d19663c11b3", + "bytes": 29843, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_2.png", + "source_sha256": "662a53b18cfe8b6fed270f5720eab8521d2718ed26bc254113bbabcaf4adb4d8", + "copied_sha256": "662a53b18cfe8b6fed270f5720eab8521d2718ed26bc254113bbabcaf4adb4d8", + "bytes": 549897, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_3.png", + "source_sha256": "d3dfb3d1c697c150177146225237b75b675d216d4b6bbb9108ed91719a0ee5e2", + "copied_sha256": "d3dfb3d1c697c150177146225237b75b675d216d4b6bbb9108ed91719a0ee5e2", + "bytes": 109683, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_4.png", + "source_sha256": "8c9d0a225d4db217a5fd21348938abba4a27f28946de6d1adee63fade7bee322", + "copied_sha256": "8c9d0a225d4db217a5fd21348938abba4a27f28946de6d1adee63fade7bee322", + "bytes": 102701, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_5.png", + "source_sha256": "b380dd97570b13b3a213424092a5a5809ee08ef3b02e324e5b16dce5053bb00f", + "copied_sha256": "b380dd97570b13b3a213424092a5a5809ee08ef3b02e324e5b16dce5053bb00f", + "bytes": 49880, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_6.png", + "source_sha256": "209f5104156d5d1ed8a40f4dd28f270620ed38ae0cd2524bb0892bd16a48ca74", + "copied_sha256": "209f5104156d5d1ed8a40f4dd28f270620ed38ae0cd2524bb0892bd16a48ca74", + "bytes": 25623, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_7.png", + "source_sha256": "0d4ed91a537d4beb3059e7cb69525e996dc6b931763a5c1b9f4b052a745f8405", + "copied_sha256": "0d4ed91a537d4beb3059e7cb69525e996dc6b931763a5c1b9f4b052a745f8405", + "bytes": 163655, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_8.png", + "source_sha256": "7409ae40b29be0014b1376e93ab130101e723df2d28d0f4394c0e883e7a70d53", + "copied_sha256": "7409ae40b29be0014b1376e93ab130101e723df2d28d0f4394c0e883e7a70d53", + "bytes": 9393, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_default_9.png", + "source_sha256": "86ac74284eab4d3b8c05229d303ad3e6ab426a567f4a6b22c48e94c267e7231d", + "copied_sha256": "86ac74284eab4d3b8c05229d303ad3e6ab426a567f4a6b22c48e94c267e7231d", + "bytes": 12091, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_1.jpg", + "source_sha256": "2278e8c410717ef5339b5343884b4b96bf446e3192b02f4ec72a526692bd0939", + "copied_sha256": "2278e8c410717ef5339b5343884b4b96bf446e3192b02f4ec72a526692bd0939", + "bytes": 498961, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_2.png", + "source_sha256": "10772cdf83c0ec68007c6d940a056183d3f015759b6d03663b2ff625e528fc78", + "copied_sha256": "10772cdf83c0ec68007c6d940a056183d3f015759b6d03663b2ff625e528fc78", + "bytes": 553852, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_3.png", + "source_sha256": "2f7605b7fc05badd7d7ab9338b1ed070fc0733bb05379d0ad99f277c7a7395fd", + "copied_sha256": "2f7605b7fc05badd7d7ab9338b1ed070fc0733bb05379d0ad99f277c7a7395fd", + "bytes": 91455, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_4.png", + "source_sha256": "ebff83c417196ead949e9804be8cfe4aa4bb8c1f4bfe90973289a07c940057f6", + "copied_sha256": "ebff83c417196ead949e9804be8cfe4aa4bb8c1f4bfe90973289a07c940057f6", + "bytes": 161708, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_5.png", + "source_sha256": "5932c7f0b58255cd50ced8d11b7e4fe7172c10d3a892eb94ed3b598759a4b3c3", + "copied_sha256": "5932c7f0b58255cd50ced8d11b7e4fe7172c10d3a892eb94ed3b598759a4b3c3", + "bytes": 137019, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_6.png", + "source_sha256": "4c7e4d4699894b7dcf23300a9d7125caaa56c3bf086cd4876fe95ca13adee0cb", + "copied_sha256": "4c7e4d4699894b7dcf23300a9d7125caaa56c3bf086cd4876fe95ca13adee0cb", + "bytes": 78973, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_7.png", + "source_sha256": "c2a4d78505fa1b167b634eea2a092368b64742af88a613a15e04d7f26b6f3c08", + "copied_sha256": "c2a4d78505fa1b167b634eea2a092368b64742af88a613a15e04d7f26b6f3c08", + "bytes": 176283, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_spring_9.png", + "source_sha256": "8217102f54988afd3904fc64c4dabbb56b6ceddc3a2cd2ed7efe5661ae95a244", + "copied_sha256": "8217102f54988afd3904fc64c4dabbb56b6ceddc3a2cd2ed7efe5661ae95a244", + "bytes": 38510, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_1.jpg", + "source_sha256": "1057135459c365a26dc3834ee96e04c8f8a728f24d52f1610274a112a7800e05", + "copied_sha256": "1057135459c365a26dc3834ee96e04c8f8a728f24d52f1610274a112a7800e05", + "bytes": 674802, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_2.png", + "source_sha256": "40abb58c9e388383669e7b3981d14441de38a237dc4920b7e943653ec69d8555", + "copied_sha256": "40abb58c9e388383669e7b3981d14441de38a237dc4920b7e943653ec69d8555", + "bytes": 122247, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_3.png", + "source_sha256": "b63fe43714a82a53ed611b94cf3362aae836865be6a29464190404655f47a1ba", + "copied_sha256": "b63fe43714a82a53ed611b94cf3362aae836865be6a29464190404655f47a1ba", + "bytes": 23360, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_4.png", + "source_sha256": "6a5bace564df8d5142e624008be6ff81004ac42375a558fbf401cda8a47f0f24", + "copied_sha256": "6a5bace564df8d5142e624008be6ff81004ac42375a558fbf401cda8a47f0f24", + "bytes": 39279, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_5.png", + "source_sha256": "4e1b89a35d4f88182ea8683aa6a227c596ed57c7f27d9431a664cdee7ca85b07", + "copied_sha256": "4e1b89a35d4f88182ea8683aa6a227c596ed57c7f27d9431a664cdee7ca85b07", + "bytes": 31303, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_6.png", + "source_sha256": "0b7ebc6fde8723da8fc3e63853b384a30a52aa2168df0db13e03cdb83d8c910f", + "copied_sha256": "0b7ebc6fde8723da8fc3e63853b384a30a52aa2168df0db13e03cdb83d8c910f", + "bytes": 21088, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_7.png", + "source_sha256": "02b5c95d262974959e58428f51ca4f12d8c6b32446d4f4bde32ea50cff0fbc5e", + "copied_sha256": "02b5c95d262974959e58428f51ca4f12d8c6b32446d4f4bde32ea50cff0fbc5e", + "bytes": 36513, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_summer_9.png", + "source_sha256": "5a3e0fa79d6db2931f6350a43dbc20383524115d0f64cfb96038758fc03951f1", + "copied_sha256": "5a3e0fa79d6db2931f6350a43dbc20383524115d0f64cfb96038758fc03951f1", + "bytes": 10384, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_1.jpg", + "source_sha256": "6f1cd2c0aa3be43f9ef64d9c7b8965adebd794458285ce87fbe5a401f995fc43", + "copied_sha256": "6f1cd2c0aa3be43f9ef64d9c7b8965adebd794458285ce87fbe5a401f995fc43", + "bytes": 801970, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_2.png", + "source_sha256": "78fca463daf00da06db83ef3f43d7bea444a57043cdce39fa23e8551b90c1a5b", + "copied_sha256": "78fca463daf00da06db83ef3f43d7bea444a57043cdce39fa23e8551b90c1a5b", + "bytes": 541937, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_3.png", + "source_sha256": "dea09c184d23dd279d29c803678b5f17adf34fd1833f34d7df9fc8dabca3eb42", + "copied_sha256": "dea09c184d23dd279d29c803678b5f17adf34fd1833f34d7df9fc8dabca3eb42", + "bytes": 107579, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_4.png", + "source_sha256": "e42dc3bd0d168fc386ee10bf6e07b92e3ddfd2267d01bfa63d27bd8fb04c372f", + "copied_sha256": "e42dc3bd0d168fc386ee10bf6e07b92e3ddfd2267d01bfa63d27bd8fb04c372f", + "bytes": 169623, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_5.png", + "source_sha256": "c36c51e0b9f237233d10f9c921bf3a42dc960546fa08885ff5fa5ac2b261c773", + "copied_sha256": "c36c51e0b9f237233d10f9c921bf3a42dc960546fa08885ff5fa5ac2b261c773", + "bytes": 148966, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_6.png", + "source_sha256": "8de23b47a1baedbd0958fd1f957b80b9ea272623605878346d2f78117c80b849", + "copied_sha256": "8de23b47a1baedbd0958fd1f957b80b9ea272623605878346d2f78117c80b849", + "bytes": 78663, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_7.png", + "source_sha256": "29be9ae301e0cd30f312d43cc0ad82d58dee99135183faee95331e5c981f5a60", + "copied_sha256": "29be9ae301e0cd30f312d43cc0ad82d58dee99135183faee95331e5c981f5a60", + "bytes": 132053, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_8.png", + "source_sha256": "5a736ae5940ec0f3a1846b8874b6b501b7e88bc1cc59aeb98684391692c8d15c", + "copied_sha256": "5a736ae5940ec0f3a1846b8874b6b501b7e88bc1cc59aeb98684391692c8d15c", + "bytes": 25604, + "modification": null + }, + { + "path": "resource/background/decorateIcon/decorate_winter_9.png", + "source_sha256": "896ac8fdaa329934a56a08f8c84b3415259a3efbe34c119a2ee7993b2640e8c4", + "copied_sha256": "896ac8fdaa329934a56a08f8c84b3415259a3efbe34c119a2ee7993b2640e8c4", + "bytes": 29214, + "modification": null + }, + { + "path": "resource/background/decorateIcon/dog_1.png", + "source_sha256": "cb1c9bddb59fd0fe55f18cbc9990bf122008d73cec184a171635d7e8ad65dfa9", + "copied_sha256": "cb1c9bddb59fd0fe55f18cbc9990bf122008d73cec184a171635d7e8ad65dfa9", + "bytes": 27052, + "modification": null + }, + { + "path": "resource/background/decorateIcon/dog_2.png", + "source_sha256": "4723e334c1e1695e230c11b765b0d3034f391ca96a95562f7426214bb01e0a4e", + "copied_sha256": "4723e334c1e1695e230c11b765b0d3034f391ca96a95562f7426214bb01e0a4e", + "bytes": 9317, + "modification": null + }, + { + "path": "resource/background/decorateIcon/dog_3.png", + "source_sha256": "6ef44c4ad2992bdb6644779a62ba90d93e44d1303eb9ceb154f6cf3ad2c531ad", + "copied_sha256": "6ef44c4ad2992bdb6644779a62ba90d93e44d1303eb9ceb154f6cf3ad2c531ad", + "bytes": 25786, + "modification": null + }, + { + "path": "resource/background/exp.png", + "source_sha256": "c3eba4d1e4bdc7ac542bad2783f9f5dd083626fe5371eb27c509ada720aba2ce", + "copied_sha256": "c3eba4d1e4bdc7ac542bad2783f9f5dd083626fe5371eb27c509ada720aba2ce", + "bytes": 3174, + "modification": null + }, + { + "path": "resource/background/expansion.png", + "source_sha256": "175e4a5e32b2e390801b554a0b6bda49a69ec660dec2c50d4dc395c231a157ab", + "copied_sha256": "175e4a5e32b2e390801b554a0b6bda49a69ec660dec2c50d4dc395c231a157ab", + "bytes": 8697, + "modification": null + }, + { + "path": "resource/background/frame/frame.png", + "source_sha256": "93148c78e15295b623a857ee016768531854696ef28557bb28e044e32a5ce6ac", + "copied_sha256": "93148c78e15295b623a857ee016768531854696ef28557bb28e044e32a5ce6ac", + "bytes": 18357, + "modification": null + }, + { + "path": "resource/background/frame/frame_10.png", + "source_sha256": "611073578b68694d11830ed487bc55cbefdb8e597f37730a8712236b91c52923", + "copied_sha256": "611073578b68694d11830ed487bc55cbefdb8e597f37730a8712236b91c52923", + "bytes": 21182, + "modification": null + }, + { + "path": "resource/background/frame/frame_11.png", + "source_sha256": "b9c07318fe567601dc8cb4cb6cc72ebc7aba550b0a3a626ebe8ca6d44fa4612c", + "copied_sha256": "b9c07318fe567601dc8cb4cb6cc72ebc7aba550b0a3a626ebe8ca6d44fa4612c", + "bytes": 26389, + "modification": null + }, + { + "path": "resource/background/frame/frame_12.png", + "source_sha256": "fee7244b2a1b327269ffb62a4a839ddc03cfdca9e631987626e67ee564c1b1d4", + "copied_sha256": "fee7244b2a1b327269ffb62a4a839ddc03cfdca9e631987626e67ee564c1b1d4", + "bytes": 302, + "modification": null + }, + { + "path": "resource/background/frame/frame_13.png", + "source_sha256": "73590acda1fd7f83c7ca3138267bfa9c8ce0015c255dfd016ef5a439e4707a30", + "copied_sha256": "73590acda1fd7f83c7ca3138267bfa9c8ce0015c255dfd016ef5a439e4707a30", + "bytes": 15816, + "modification": null + }, + { + "path": "resource/background/frame/frame_2.png", + "source_sha256": "3d92e891f5ac7cc1b590c940ea18b08ba304b935b5ad5faf74ea8a2acbbf696f", + "copied_sha256": "3d92e891f5ac7cc1b590c940ea18b08ba304b935b5ad5faf74ea8a2acbbf696f", + "bytes": 15223, + "modification": null + }, + { + "path": "resource/background/frame/frame_27.png", + "source_sha256": "2d67c0a3919f5c4419b59d717a1d77dbb5f49e6811f36cb0cfffac5bd4c58651", + "copied_sha256": "2d67c0a3919f5c4419b59d717a1d77dbb5f49e6811f36cb0cfffac5bd4c58651", + "bytes": 45449, + "modification": null + }, + { + "path": "resource/background/frame/frame_29.png", + "source_sha256": "46023c575f91de5eb7cb4056b0401c683453ca1bafe597a249b7db4f2d9732d2", + "copied_sha256": "46023c575f91de5eb7cb4056b0401c683453ca1bafe597a249b7db4f2d9732d2", + "bytes": 28113, + "modification": null + }, + { + "path": "resource/background/frame/frame_3.png", + "source_sha256": "d227fb2635b93f787bcc741a760f5d44dc55e4e2173a50e1fc1bd4195dcf39cc", + "copied_sha256": "d227fb2635b93f787bcc741a760f5d44dc55e4e2173a50e1fc1bd4195dcf39cc", + "bytes": 10565, + "modification": null + }, + { + "path": "resource/background/frame/frame_4.png", + "source_sha256": "f5fb002a9f27823c6c99bcb24a2a987604cabc1562b6a0463bf7a447fa0ad76e", + "copied_sha256": "f5fb002a9f27823c6c99bcb24a2a987604cabc1562b6a0463bf7a447fa0ad76e", + "bytes": 12257, + "modification": null + }, + { + "path": "resource/background/frame/frame_43.png", + "source_sha256": "c62cbe9584c259dfc8980115910cf926dec7726ff3c0f63f41849c8ae05b54db", + "copied_sha256": "c62cbe9584c259dfc8980115910cf926dec7726ff3c0f63f41849c8ae05b54db", + "bytes": 31921, + "modification": null + }, + { + "path": "resource/background/frame/frame_44.png", + "source_sha256": "e35ccc28035d9f2839629875ef8a82385721158c7a4939d0ec1a7e54a6114161", + "copied_sha256": "e35ccc28035d9f2839629875ef8a82385721158c7a4939d0ec1a7e54a6114161", + "bytes": 54761, + "modification": null + }, + { + "path": "resource/background/frame/frame_45.png", + "source_sha256": "9bdfbf9f32caada5ebbb3755c8e267006f37bde5c78d586c80b4305f1ba5744f", + "copied_sha256": "9bdfbf9f32caada5ebbb3755c8e267006f37bde5c78d586c80b4305f1ba5744f", + "bytes": 64139, + "modification": null + }, + { + "path": "resource/background/frame/frame_5.png", + "source_sha256": "e04f61c7f444dc2b4c327ca903fd96bac65455a3a9863738a394af103b91dd80", + "copied_sha256": "e04f61c7f444dc2b4c327ca903fd96bac65455a3a9863738a394af103b91dd80", + "bytes": 12761, + "modification": null + }, + { + "path": "resource/background/frame/frame_6.png", + "source_sha256": "93e8c5e137c9d04377e0c0be8be13f6b550985190a5cc06217ef4eba6da83a1e", + "copied_sha256": "93e8c5e137c9d04377e0c0be8be13f6b550985190a5cc06217ef4eba6da83a1e", + "bytes": 13031, + "modification": null + }, + { + "path": "resource/background/frame/frame_7.png", + "source_sha256": "2462e89b2ab251aa9a68629bac3311d317660f9bc711547b1a859113643e6c2c", + "copied_sha256": "2462e89b2ab251aa9a68629bac3311d317660f9bc711547b1a859113643e6c2c", + "bytes": 11966, + "modification": null + }, + { + "path": "resource/background/frame/frame_8.png", + "source_sha256": "1ffc22749cc07cc04bc80c3985636d3f154fe16ab5f554d164c0dff5c415fcf0", + "copied_sha256": "1ffc22749cc07cc04bc80c3985636d3f154fe16ab5f554d164c0dff5c415fcf0", + "bytes": 14588, + "modification": null + }, + { + "path": "resource/background/frame/frame_9.png", + "source_sha256": "a461479a1a1331e3718b9b58197a2a9b87f0cab652d2efd1a820c64962865551", + "copied_sha256": "a461479a1a1331e3718b9b58197a2a9b87f0cab652d2efd1a820c64962865551", + "bytes": 20194, + "modification": null + }, + { + "path": "resource/background/point.png", + "source_sha256": "ee617b0c4047a380c017f7bef9fcd707c60894a162473ab112896d4cd2423aa2", + "copied_sha256": "ee617b0c4047a380c017f7bef9fcd707c60894a162473ab112896d4cd2423aa2", + "bytes": 17640, + "modification": null + }, + { + "path": "resource/background/ripe.png", + "source_sha256": "1c94af3e0b923defc85d200bd25538bf1ee9a2e744406266cdaf7103c1ea2cbd", + "copied_sha256": "1c94af3e0b923defc85d200bd25538bf1ee9a2e744406266cdaf7103c1ea2cbd", + "bytes": 5354, + "modification": null + }, + { + "path": "resource/background/userInfo.png", + "source_sha256": "09e906c85d12491c297489ee6bcc31cd7f9e0c1527808c9c64d1783e8ae3cff3", + "copied_sha256": "09e906c85d12491c297489ee6bcc31cd7f9e0c1527808c9c64d1783e8ae3cff3", + "bytes": 47661, + "modification": null + }, + { + "path": "resource/background/vipPoint.png", + "source_sha256": "6e86f20bf5e6e1d1ac841f5263b0ce6fa2122a3812526acecb4fa7a4484a1d0d", + "copied_sha256": "6e86f20bf5e6e1d1ac841f5263b0ce6fa2122a3812526acecb4fa7a4484a1d0d", + "bytes": 2993, + "modification": null + }, + { + "path": "resource/db/plant-test.db", + "source_sha256": "8a8129213ca22131c927534938faf3824efce294de999b4b24b22807447934f2", + "copied_sha256": "8a8129213ca22131c927534938faf3824efce294de999b4b24b22807447934f2", + "bytes": 36864, + "modification": null + }, + { + "path": "resource/db/plant.db", + "source_sha256": "21f11e818909dda4d60864374062c46e0c86e9c2f01d2759225aba466d9de9eb", + "copied_sha256": "21f11e818909dda4d60864374062c46e0c86e9c2f01d2759225aba466d9de9eb", + "bytes": 36864, + "modification": null + }, + { + "path": "resource/db/version.json", + "source_sha256": "d91f19bf65b0622530566b95dbb38a1c0c3ce290d1bda3617b683dea55b139e0", + "copied_sha256": "d91f19bf65b0622530566b95dbb38a1c0c3ce290d1bda3617b683dea55b139e0", + "bytes": 17, + "modification": null + }, + { + "path": "resource/html/help.html", + "source_sha256": "aba7bb382ad7d29cf98981f5238cc849ce81e0c361bd0dc42b5fd59fb417e67d", + "copied_sha256": "aba7bb382ad7d29cf98981f5238cc849ce81e0c361bd0dc42b5fd59fb417e67d", + "bytes": 28210, + "modification": null + }, + { + "path": "resource/html/sign_in.html", + "source_sha256": "7c8622054b193af7d71e1e8e887d3211f70015092b5f40ee2358e0e9132abe74", + "copied_sha256": "7c8622054b193af7d71e1e8e887d3211f70015092b5f40ee2358e0e9132abe74", + "bytes": 6696, + "modification": null + }, + { + "path": "resource/plant/ATTomato/1.png", + "source_sha256": "48de2a54c2868852f70e981a0ef8228ad0bb09499e6c9e84057aaf82f16f7270", + "copied_sha256": "48de2a54c2868852f70e981a0ef8228ad0bb09499e6c9e84057aaf82f16f7270", + "bytes": 4519, + "modification": null + }, + { + "path": "resource/plant/ATTomato/2.png", + "source_sha256": "d45b3e6896e6eaac51d40fe85ed460b686a8f1d91578a271369f0ea2250f9460", + "copied_sha256": "d45b3e6896e6eaac51d40fe85ed460b686a8f1d91578a271369f0ea2250f9460", + "bytes": 5821, + "modification": null + }, + { + "path": "resource/plant/ATTomato/3.png", + "source_sha256": "86eb67cc3904bd2cf234cc30c27b01a911f1abdfeec6ccc58f9569a028ad0056", + "copied_sha256": "86eb67cc3904bd2cf234cc30c27b01a911f1abdfeec6ccc58f9569a028ad0056", + "bytes": 16881, + "modification": null + }, + { + "path": "resource/plant/ATTomato/4.png", + "source_sha256": "14a494d9d0a42315cf09f7c48e7ad11e33a035bda5d0ae4de0b7e42832808c52", + "copied_sha256": "14a494d9d0a42315cf09f7c48e7ad11e33a035bda5d0ae4de0b7e42832808c52", + "bytes": 18666, + "modification": null + }, + { + "path": "resource/plant/ATTomato/5.png", + "source_sha256": "52a455a943fa41d30db8c2d20861e2d6d465d6f28511933e2b2b3ec994b41a01", + "copied_sha256": "52a455a943fa41d30db8c2d20861e2d6d465d6f28511933e2b2b3ec994b41a01", + "bytes": 18537, + "modification": null + }, + { + "path": "resource/plant/ATTomato/icon.png", + "source_sha256": "d068d503bc2abdee8037a02981d4511a9c0e3c8f9ebeec13a5ec52c14a4efb61", + "copied_sha256": "d068d503bc2abdee8037a02981d4511a9c0e3c8f9ebeec13a5ec52c14a4efb61", + "bytes": 7309, + "modification": null + }, + { + "path": "resource/plant/basic/0.png", + "source_sha256": "ae5a1a593c40f311862d4bc9fecb7e16f8a2d92307b7141295fe4fe5d2bab6c9", + "copied_sha256": "ae5a1a593c40f311862d4bc9fecb7e16f8a2d92307b7141295fe4fe5d2bab6c9", + "bytes": 29996, + "modification": null + }, + { + "path": "resource/plant/basic/9.png", + "source_sha256": "c63f5e7b4a948b5af1f8bf8ef52c6d93f52f0ed6fb0c68b35faae39fcdadd25d", + "copied_sha256": "c63f5e7b4a948b5af1f8bf8ef52c6d93f52f0ed6fb0c68b35faae39fcdadd25d", + "bytes": 17524, + "modification": null + }, + { + "path": "resource/plant/一点红/1.png", + "source_sha256": "3c72c1f4768ab80d893b446bdd8507016eeb87a980b689b04c98b05b2ed95159", + "copied_sha256": "3c72c1f4768ab80d893b446bdd8507016eeb87a980b689b04c98b05b2ed95159", + "bytes": 1510, + "modification": null + }, + { + "path": "resource/plant/一点红/2.png", + "source_sha256": "15f013dbbfe4dcb1ddc4f9f425a262101a9a970ffaac151b995b252028d65c5a", + "copied_sha256": "15f013dbbfe4dcb1ddc4f9f425a262101a9a970ffaac151b995b252028d65c5a", + "bytes": 4235, + "modification": null + }, + { + "path": "resource/plant/一点红/3.png", + "source_sha256": "7f10a4e8a65323781db45befa1102b4c4d6a4ddc3195372c9da8ab28541fe8bb", + "copied_sha256": "7f10a4e8a65323781db45befa1102b4c4d6a4ddc3195372c9da8ab28541fe8bb", + "bytes": 8747, + "modification": null + }, + { + "path": "resource/plant/一点红/4.png", + "source_sha256": "98b7ee9adc622b07dccb5985d002c8bbdb851a57c15b789e2d8b69b27b82b917", + "copied_sha256": "98b7ee9adc622b07dccb5985d002c8bbdb851a57c15b789e2d8b69b27b82b917", + "bytes": 12662, + "modification": null + }, + { + "path": "resource/plant/一点红/5.png", + "source_sha256": "2e798ef1d714b720359a2e367c0f752cb687f7cad7ede321e4402d056dd2a010", + "copied_sha256": "2e798ef1d714b720359a2e367c0f752cb687f7cad7ede321e4402d056dd2a010", + "bytes": 16101, + "modification": null + }, + { + "path": "resource/plant/一点红/icon.png", + "source_sha256": "ad4068587a7cc6d5d956fc7d2f862812c5cf66d6e653409613f89be0d4e5c6e1", + "copied_sha256": "ad4068587a7cc6d5d956fc7d2f862812c5cf66d6e653409613f89be0d4e5c6e1", + "bytes": 12356, + "modification": null + }, + { + "path": "resource/plant/三七/1.png", + "source_sha256": "fe1d2a2a71b844052e685db09acd5bbc3df8dfce2b2838e9fcd7de1e1eeffe59", + "copied_sha256": "fe1d2a2a71b844052e685db09acd5bbc3df8dfce2b2838e9fcd7de1e1eeffe59", + "bytes": 2202, + "modification": null + }, + { + "path": "resource/plant/三七/2.png", + "source_sha256": "45ba5533d6f78b101358e2b3839293eabb12bf5bd481104da5e4a15f466cd741", + "copied_sha256": "45ba5533d6f78b101358e2b3839293eabb12bf5bd481104da5e4a15f466cd741", + "bytes": 5391, + "modification": null + }, + { + "path": "resource/plant/三七/3.png", + "source_sha256": "1fa3239fba0a0df36096129080d28c2b9ea4e0440fecf5487b68ad6e1a535f95", + "copied_sha256": "1fa3239fba0a0df36096129080d28c2b9ea4e0440fecf5487b68ad6e1a535f95", + "bytes": 9957, + "modification": null + }, + { + "path": "resource/plant/三七/4.png", + "source_sha256": "3090215be724c0852d01648fe14b46b3cd4f55367bd6449df4bb4f1295bd5f54", + "copied_sha256": "3090215be724c0852d01648fe14b46b3cd4f55367bd6449df4bb4f1295bd5f54", + "bytes": 13137, + "modification": null + }, + { + "path": "resource/plant/三七/5.png", + "source_sha256": "efebadda237de8b7de613595c84f51c5ca043b00b7451b1e2f2e94a9a5d58457", + "copied_sha256": "efebadda237de8b7de613595c84f51c5ca043b00b7451b1e2f2e94a9a5d58457", + "bytes": 17289, + "modification": null + }, + { + "path": "resource/plant/三七/icon.png", + "source_sha256": "ef0d8011e9d7bd12d930f12b1781b027b335832d73ca0b42d0c1edf754140693", + "copied_sha256": "ef0d8011e9d7bd12d930f12b1781b027b335832d73ca0b42d0c1edf754140693", + "bytes": 13176, + "modification": null + }, + { + "path": "resource/plant/丝瓜/1.png", + "source_sha256": "b75580e6bd830d96da1840ebb45284998409e06e36b9001dc5011510d069b869", + "copied_sha256": "b75580e6bd830d96da1840ebb45284998409e06e36b9001dc5011510d069b869", + "bytes": 6979, + "modification": null + }, + { + "path": "resource/plant/丝瓜/2.png", + "source_sha256": "95e82fb13a9c398df8d1e5ce1ace7aa95a4b75dc17a62cab88715c1c0bb7fbc5", + "copied_sha256": "95e82fb13a9c398df8d1e5ce1ace7aa95a4b75dc17a62cab88715c1c0bb7fbc5", + "bytes": 9050, + "modification": null + }, + { + "path": "resource/plant/丝瓜/3.png", + "source_sha256": "400af9e1eee70dc1848ac56273e34bcfd1be6b1c4205fd72e9021093c15fac18", + "copied_sha256": "400af9e1eee70dc1848ac56273e34bcfd1be6b1c4205fd72e9021093c15fac18", + "bytes": 13474, + "modification": null + }, + { + "path": "resource/plant/丝瓜/4.png", + "source_sha256": "6077431d7a8db083c99c639ce51cdb85be07e0dd08e187183d0af62f86f04371", + "copied_sha256": "6077431d7a8db083c99c639ce51cdb85be07e0dd08e187183d0af62f86f04371", + "bytes": 16387, + "modification": null + }, + { + "path": "resource/plant/丝瓜/5.png", + "source_sha256": "cd311f081e56a940ea0227271818d44315ca03e0e8054e086dbede0e7d1b9572", + "copied_sha256": "cd311f081e56a940ea0227271818d44315ca03e0e8054e086dbede0e7d1b9572", + "bytes": 18376, + "modification": null + }, + { + "path": "resource/plant/丝瓜/icon.png", + "source_sha256": "00296af1512d7a17005f363db66c2ec7e0af7a1912d079cc1d846cd3d68c88a9", + "copied_sha256": "00296af1512d7a17005f363db66c2ec7e0af7a1912d079cc1d846cd3d68c88a9", + "bytes": 7489, + "modification": null + }, + { + "path": "resource/plant/乌饭子/1.png", + "source_sha256": "2e0b0829f5ec28912f46c0c6d767655580a26c8e147a26771f936cb02115dadc", + "copied_sha256": "2e0b0829f5ec28912f46c0c6d767655580a26c8e147a26771f936cb02115dadc", + "bytes": 6559, + "modification": null + }, + { + "path": "resource/plant/乌饭子/2.png", + "source_sha256": "f71428fe60ae693038a9e15cb5db70a5b666a03506f54f98c295b8f490251e1e", + "copied_sha256": "f71428fe60ae693038a9e15cb5db70a5b666a03506f54f98c295b8f490251e1e", + "bytes": 12826, + "modification": null + }, + { + "path": "resource/plant/乌饭子/3.png", + "source_sha256": "2bdcb1ab9fba0085e73dbc7ef6ec2649d7b882f796139da028c95776fb129ac5", + "copied_sha256": "2bdcb1ab9fba0085e73dbc7ef6ec2649d7b882f796139da028c95776fb129ac5", + "bytes": 18863, + "modification": null + }, + { + "path": "resource/plant/乌饭子/4.png", + "source_sha256": "efd432f290a460195d789fffecb91b24325899a880490ace6845473853ede42a", + "copied_sha256": "efd432f290a460195d789fffecb91b24325899a880490ace6845473853ede42a", + "bytes": 23249, + "modification": null + }, + { + "path": "resource/plant/乌饭子/5.png", + "source_sha256": "3e15d27496b1c4f5c80410a29b8ba13d9b7c61ae1ea20d429e4a674b4016baad", + "copied_sha256": "3e15d27496b1c4f5c80410a29b8ba13d9b7c61ae1ea20d429e4a674b4016baad", + "bytes": 22241, + "modification": null + }, + { + "path": "resource/plant/乌饭子/icon.png", + "source_sha256": "a9706e469b128fd5b2b33d89b381851501049462c5ccac57d7639d06713999f6", + "copied_sha256": "a9706e469b128fd5b2b33d89b381851501049462c5ccac57d7639d06713999f6", + "bytes": 12449, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/1.png", + "source_sha256": "ef15350890e305dc58c35c1610aec3557eab8870f596696bb50beeb8d3e54825", + "copied_sha256": "ef15350890e305dc58c35c1610aec3557eab8870f596696bb50beeb8d3e54825", + "bytes": 749, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/2.png", + "source_sha256": "ff966e5852ad3edfbb39a89372ba2c775a7a336721c72ba7b35d65f0f18c1cd2", + "copied_sha256": "ff966e5852ad3edfbb39a89372ba2c775a7a336721c72ba7b35d65f0f18c1cd2", + "bytes": 2699, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/3.png", + "source_sha256": "139d02f3e643937b7330f56f2a73339596a2cb36b5d08139962d85d152dc22c5", + "copied_sha256": "139d02f3e643937b7330f56f2a73339596a2cb36b5d08139962d85d152dc22c5", + "bytes": 8342, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/4.png", + "source_sha256": "c965913561c318779c50a39792cb39bf3abc328abe819fd3d401fffe44a0a599", + "copied_sha256": "c965913561c318779c50a39792cb39bf3abc328abe819fd3d401fffe44a0a599", + "bytes": 10355, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/5.png", + "source_sha256": "d3c9df81b724a3a52e692f6b973c07953802f38b3bc9e0ec380eb76d8e433b31", + "copied_sha256": "d3c9df81b724a3a52e692f6b973c07953802f38b3bc9e0ec380eb76d8e433b31", + "bytes": 16943, + "modification": null + }, + { + "path": "resource/plant/兔儿伞/icon.png", + "source_sha256": "e926dd93d2d40355f304921e7173b4f8de51a56a91e84271a49cbf64b01cb7a4", + "copied_sha256": "e926dd93d2d40355f304921e7173b4f8de51a56a91e84271a49cbf64b01cb7a4", + "bytes": 9932, + "modification": null + }, + { + "path": "resource/plant/关白附子/1.png", + "source_sha256": "fbd4d75d0050e590ac8a28e5f14474f5c817b44e41ff96db0603d4bd40a0553a", + "copied_sha256": "fbd4d75d0050e590ac8a28e5f14474f5c817b44e41ff96db0603d4bd40a0553a", + "bytes": 1508, + "modification": null + }, + { + "path": "resource/plant/关白附子/2.png", + "source_sha256": "26e4a917b247b4dfe1d37d8922c59e2e39a5a7ad10493b91c3b119464c0c86b4", + "copied_sha256": "26e4a917b247b4dfe1d37d8922c59e2e39a5a7ad10493b91c3b119464c0c86b4", + "bytes": 6172, + "modification": null + }, + { + "path": "resource/plant/关白附子/3.png", + "source_sha256": "c16a5e1624122a468e7ef8007aae5af05399a16568adf658ea43888a6a106b73", + "copied_sha256": "c16a5e1624122a468e7ef8007aae5af05399a16568adf658ea43888a6a106b73", + "bytes": 8868, + "modification": null + }, + { + "path": "resource/plant/关白附子/4.png", + "source_sha256": "022f3953e86daf30a6590fed4948b742d79f790d90fa8dfdfe7471b480fd660f", + "copied_sha256": "022f3953e86daf30a6590fed4948b742d79f790d90fa8dfdfe7471b480fd660f", + "bytes": 14285, + "modification": null + }, + { + "path": "resource/plant/关白附子/5.png", + "source_sha256": "9847cc567358d9198fd9fa28d978fdfcdbf257177b000f162c8b2f851c2984af", + "copied_sha256": "9847cc567358d9198fd9fa28d978fdfcdbf257177b000f162c8b2f851c2984af", + "bytes": 20732, + "modification": null + }, + { + "path": "resource/plant/关白附子/icon.png", + "source_sha256": "d79e0be6debf78ac5a1ea853b7c45699d127fb3067c659cfc4d8d85e8c134992", + "copied_sha256": "d79e0be6debf78ac5a1ea853b7c45699d127fb3067c659cfc4d8d85e8c134992", + "bytes": 10114, + "modification": null + }, + { + "path": "resource/plant/关苍术/1.png", + "source_sha256": "bf10e095be420c3877ca6ebb553699e7c0604ab66db7a32b08d2b0a471c99aaa", + "copied_sha256": "bf10e095be420c3877ca6ebb553699e7c0604ab66db7a32b08d2b0a471c99aaa", + "bytes": 841, + "modification": null + }, + { + "path": "resource/plant/关苍术/2.png", + "source_sha256": "f5ec24c0e5bd8eeb164558ced56ef702c0b7264ab32961ba462c516c77a302c8", + "copied_sha256": "f5ec24c0e5bd8eeb164558ced56ef702c0b7264ab32961ba462c516c77a302c8", + "bytes": 3341, + "modification": null + }, + { + "path": "resource/plant/关苍术/3.png", + "source_sha256": "5b2feb00c054e396b408d0e6461a58a2e27743a93286c354380341193cd34164", + "copied_sha256": "5b2feb00c054e396b408d0e6461a58a2e27743a93286c354380341193cd34164", + "bytes": 7656, + "modification": null + }, + { + "path": "resource/plant/关苍术/4.png", + "source_sha256": "e8a7071f31d8d49f065fb195d8749d771257c56f354659c653980f872074a61a", + "copied_sha256": "e8a7071f31d8d49f065fb195d8749d771257c56f354659c653980f872074a61a", + "bytes": 9220, + "modification": null + }, + { + "path": "resource/plant/关苍术/5.png", + "source_sha256": "4ef4d96c237638b20b6f63dbc05901d751ba6e334cc15c13ac93fb9b5254794f", + "copied_sha256": "4ef4d96c237638b20b6f63dbc05901d751ba6e334cc15c13ac93fb9b5254794f", + "bytes": 13376, + "modification": null + }, + { + "path": "resource/plant/关苍术/icon.png", + "source_sha256": "887c9d4f2f7514767c5075bd41ace5dffc4685c23ae7b031d5df2a62c266da6d", + "copied_sha256": "887c9d4f2f7514767c5075bd41ace5dffc4685c23ae7b031d5df2a62c266da6d", + "bytes": 13071, + "modification": null + }, + { + "path": "resource/plant/冬凌草/1.png", + "source_sha256": "a49b45a256120ecd3f243c4d15214a17907d980c937dc72e58db8ee2e0b7596b", + "copied_sha256": "a49b45a256120ecd3f243c4d15214a17907d980c937dc72e58db8ee2e0b7596b", + "bytes": 1239, + "modification": null + }, + { + "path": "resource/plant/冬凌草/2.png", + "source_sha256": "19d4fc927cc4f89d73df42aa7c906a7c38f8af875592f713c57e19b29aec3a50", + "copied_sha256": "19d4fc927cc4f89d73df42aa7c906a7c38f8af875592f713c57e19b29aec3a50", + "bytes": 3920, + "modification": null + }, + { + "path": "resource/plant/冬凌草/3.png", + "source_sha256": "be6fbbe778b49ecf3fda5bfbe143ac7bb1f01c49d258ba35112989258b57042b", + "copied_sha256": "be6fbbe778b49ecf3fda5bfbe143ac7bb1f01c49d258ba35112989258b57042b", + "bytes": 6726, + "modification": null + }, + { + "path": "resource/plant/冬凌草/4.png", + "source_sha256": "e93c8eed1c2c92fa8fe12a2d4762a453119f6f98ff025668fc54666dd33f3909", + "copied_sha256": "e93c8eed1c2c92fa8fe12a2d4762a453119f6f98ff025668fc54666dd33f3909", + "bytes": 10780, + "modification": null + }, + { + "path": "resource/plant/冬凌草/5.png", + "source_sha256": "76716f373e1b7ce3a2988732cab3f30afbff47a7a2035a9a13cfdc3791b078d7", + "copied_sha256": "76716f373e1b7ce3a2988732cab3f30afbff47a7a2035a9a13cfdc3791b078d7", + "bytes": 15397, + "modification": null + }, + { + "path": "resource/plant/冬凌草/icon.png", + "source_sha256": "ed38c3b565204f904ed0142024132823f161e48dc6fa2c40ca1911f9e4104a40", + "copied_sha256": "ed38c3b565204f904ed0142024132823f161e48dc6fa2c40ca1911f9e4104a40", + "bytes": 15642, + "modification": null + }, + { + "path": "resource/plant/冬瓜/1.png", + "source_sha256": "2c3431aa7b60595c43a127a9877582509cb4f3636939eeb09bf7183c45fc821f", + "copied_sha256": "2c3431aa7b60595c43a127a9877582509cb4f3636939eeb09bf7183c45fc821f", + "bytes": 3422, + "modification": null + }, + { + "path": "resource/plant/冬瓜/2.png", + "source_sha256": "219fe9dc5c88659f659774dde963fc32cd3c849f5313f32f0cc67d4ae291afda", + "copied_sha256": "219fe9dc5c88659f659774dde963fc32cd3c849f5313f32f0cc67d4ae291afda", + "bytes": 15536, + "modification": null + }, + { + "path": "resource/plant/冬瓜/3.png", + "source_sha256": "353219c03bf3b4d534bfe0e45f8e36129b311cb860f2d6aa68c3a8e2895c00f5", + "copied_sha256": "353219c03bf3b4d534bfe0e45f8e36129b311cb860f2d6aa68c3a8e2895c00f5", + "bytes": 23319, + "modification": null + }, + { + "path": "resource/plant/冬瓜/4.png", + "source_sha256": "7a396acdb27af351102904df5477d1ac7c5e102fb8f02021111220257b2ee5b9", + "copied_sha256": "7a396acdb27af351102904df5477d1ac7c5e102fb8f02021111220257b2ee5b9", + "bytes": 23440, + "modification": null + }, + { + "path": "resource/plant/冬瓜/5.png", + "source_sha256": "18aa7676e59f6fd07f1625c9d594fce574aa500548d630f0d75946c2b82835cf", + "copied_sha256": "18aa7676e59f6fd07f1625c9d594fce574aa500548d630f0d75946c2b82835cf", + "bytes": 24431, + "modification": null + }, + { + "path": "resource/plant/冬瓜/icon.png", + "source_sha256": "e5968bfce8e7abfc617ce7eec59001a0fcbc6109025c34d11cc83aea283c3bf9", + "copied_sha256": "e5968bfce8e7abfc617ce7eec59001a0fcbc6109025c34d11cc83aea283c3bf9", + "bytes": 8303, + "modification": null + }, + { + "path": "resource/plant/决明子/1.png", + "source_sha256": "04fe55f4ae6204b073b37b149716f7add4e689f8ab24d2be6119789c3de0c348", + "copied_sha256": "04fe55f4ae6204b073b37b149716f7add4e689f8ab24d2be6119789c3de0c348", + "bytes": 2215, + "modification": null + }, + { + "path": "resource/plant/决明子/2.png", + "source_sha256": "1f8f9aaed45514de83f2afa6d07480dde313be41242b8133154ae3c8aa473911", + "copied_sha256": "1f8f9aaed45514de83f2afa6d07480dde313be41242b8133154ae3c8aa473911", + "bytes": 10356, + "modification": null + }, + { + "path": "resource/plant/决明子/3.png", + "source_sha256": "89a3311d1b3c5c1808848236359b400c81b263747ada99baaa4b9864234349f1", + "copied_sha256": "89a3311d1b3c5c1808848236359b400c81b263747ada99baaa4b9864234349f1", + "bytes": 16861, + "modification": null + }, + { + "path": "resource/plant/决明子/4.png", + "source_sha256": "ee57cf04bd5ce0b54b836e836ae97e7ad743dadea754cd3c55b718f5940b6094", + "copied_sha256": "ee57cf04bd5ce0b54b836e836ae97e7ad743dadea754cd3c55b718f5940b6094", + "bytes": 20073, + "modification": null + }, + { + "path": "resource/plant/决明子/5.png", + "source_sha256": "0db21e2b5a269a76998c9fd320e5d6426f4be42bedd3d746c3dae39691335a3d", + "copied_sha256": "0db21e2b5a269a76998c9fd320e5d6426f4be42bedd3d746c3dae39691335a3d", + "bytes": 22713, + "modification": null + }, + { + "path": "resource/plant/决明子/icon.png", + "source_sha256": "0c8c110c09f8ae87ad09003da6bbc65c19f291644356a523901573a237283256", + "copied_sha256": "0c8c110c09f8ae87ad09003da6bbc65c19f291644356a523901573a237283256", + "bytes": 7345, + "modification": null + }, + { + "path": "resource/plant/南瓜/1.png", + "source_sha256": "a5bf0620aadb4fc9ca624dfb6a11b00c1d6f4028b5d6befd59cae59885085732", + "copied_sha256": "a5bf0620aadb4fc9ca624dfb6a11b00c1d6f4028b5d6befd59cae59885085732", + "bytes": 2409, + "modification": null + }, + { + "path": "resource/plant/南瓜/2.png", + "source_sha256": "71153e744e97a506014f90569426b52a510af1fcc8c15db27dc2a1e58b359066", + "copied_sha256": "71153e744e97a506014f90569426b52a510af1fcc8c15db27dc2a1e58b359066", + "bytes": 10105, + "modification": null + }, + { + "path": "resource/plant/南瓜/3.png", + "source_sha256": "d2de11943128950bf708ec06ae440fa061760a05be9c08afc5d5d85f8878bae9", + "copied_sha256": "d2de11943128950bf708ec06ae440fa061760a05be9c08afc5d5d85f8878bae9", + "bytes": 19273, + "modification": null + }, + { + "path": "resource/plant/南瓜/4.png", + "source_sha256": "3fba9df28d1540a50ccfc3b0482ac7709d49bfc6c22210ab4b59b9a064628f06", + "copied_sha256": "3fba9df28d1540a50ccfc3b0482ac7709d49bfc6c22210ab4b59b9a064628f06", + "bytes": 20387, + "modification": null + }, + { + "path": "resource/plant/南瓜/5.png", + "source_sha256": "1baa5daa917169081e61a1f4f2dc3044002b8afc66acec97b495b0777d31615d", + "copied_sha256": "1baa5daa917169081e61a1f4f2dc3044002b8afc66acec97b495b0777d31615d", + "bytes": 21222, + "modification": null + }, + { + "path": "resource/plant/南瓜/icon.png", + "source_sha256": "d359d58df510dd25ab5cb7469548fb2c3991516953e1346177128b79d6f40291", + "copied_sha256": "d359d58df510dd25ab5cb7469548fb2c3991516953e1346177128b79d6f40291", + "bytes": 6674, + "modification": null + }, + { + "path": "resource/plant/双玉兰/1.png", + "source_sha256": "030576ce164c3eb12ac3105dc4ce7c5b6d8ac676acc216f74ed13c4ebfa2f1b3", + "copied_sha256": "030576ce164c3eb12ac3105dc4ce7c5b6d8ac676acc216f74ed13c4ebfa2f1b3", + "bytes": 795, + "modification": null + }, + { + "path": "resource/plant/双玉兰/2.png", + "source_sha256": "d6dabbad486a58c0cda2850de4fe1491a23f85960b387b93dd8683c0625c59f5", + "copied_sha256": "d6dabbad486a58c0cda2850de4fe1491a23f85960b387b93dd8683c0625c59f5", + "bytes": 3331, + "modification": null + }, + { + "path": "resource/plant/双玉兰/3.png", + "source_sha256": "d6454d363f14dc44c35d867b426c6372fbc13e8ddc4babc1060e4ad31f8bc065", + "copied_sha256": "d6454d363f14dc44c35d867b426c6372fbc13e8ddc4babc1060e4ad31f8bc065", + "bytes": 5859, + "modification": null + }, + { + "path": "resource/plant/双玉兰/4.png", + "source_sha256": "4ed9f5b31c64728e996e54b682902d8b8e6abb31ab6c019f131c866857fbc18f", + "copied_sha256": "4ed9f5b31c64728e996e54b682902d8b8e6abb31ab6c019f131c866857fbc18f", + "bytes": 11703, + "modification": null + }, + { + "path": "resource/plant/双玉兰/5.png", + "source_sha256": "a433966e33487cef0e7acd98fae419ff66d63c461a8fb63344fc2f516452fafe", + "copied_sha256": "a433966e33487cef0e7acd98fae419ff66d63c461a8fb63344fc2f516452fafe", + "bytes": 20395, + "modification": null + }, + { + "path": "resource/plant/双玉兰/icon.png", + "source_sha256": "c235b113f1a774bca8f13af972e2d2d7e40e5691b66ce20e6d48ddad732afacc", + "copied_sha256": "c235b113f1a774bca8f13af972e2d2d7e40e5691b66ce20e6d48ddad732afacc", + "bytes": 9583, + "modification": null + }, + { + "path": "resource/plant/可可豆/1.png", + "source_sha256": "aba02a434f5404abfa50e7e500d775c4c0e9d2626e23171c84a4b0d22bcf3fd2", + "copied_sha256": "aba02a434f5404abfa50e7e500d775c4c0e9d2626e23171c84a4b0d22bcf3fd2", + "bytes": 1717, + "modification": null + }, + { + "path": "resource/plant/可可豆/2.png", + "source_sha256": "69468aaf7bb4fb752a43d1e0d215d2dbba3ecd8a655457907bc80071776f5a6a", + "copied_sha256": "69468aaf7bb4fb752a43d1e0d215d2dbba3ecd8a655457907bc80071776f5a6a", + "bytes": 9148, + "modification": null + }, + { + "path": "resource/plant/可可豆/3.png", + "source_sha256": "45418c35d3add710805c403cd14c7c03f8c8edd4aeee230ffc874eaa2e009ff0", + "copied_sha256": "45418c35d3add710805c403cd14c7c03f8c8edd4aeee230ffc874eaa2e009ff0", + "bytes": 16079, + "modification": null + }, + { + "path": "resource/plant/可可豆/4.png", + "source_sha256": "06de387193251997fac472f50a733464ef5e0497604bc1783c2de6ceafb853ba", + "copied_sha256": "06de387193251997fac472f50a733464ef5e0497604bc1783c2de6ceafb853ba", + "bytes": 22526, + "modification": null + }, + { + "path": "resource/plant/可可豆/5.png", + "source_sha256": "22be6b287999ecb2ef1cd8ef6198281f5f566148c83b38dc9d0750bf8efb75c4", + "copied_sha256": "22be6b287999ecb2ef1cd8ef6198281f5f566148c83b38dc9d0750bf8efb75c4", + "bytes": 26310, + "modification": null + }, + { + "path": "resource/plant/可可豆/icon.png", + "source_sha256": "9f76fca22a82122db0cea2ee6e60fe6e799f5b2be160ba80cf1ce0dea771633b", + "copied_sha256": "9f76fca22a82122db0cea2ee6e60fe6e799f5b2be160ba80cf1ce0dea771633b", + "bytes": 13066, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/1.png", + "source_sha256": "a5ae6c92787117b996a382424d9408e0dd642845eb94982e3374a93151bc5058", + "copied_sha256": "a5ae6c92787117b996a382424d9408e0dd642845eb94982e3374a93151bc5058", + "bytes": 1944, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/2.png", + "source_sha256": "e2aa3e4ee2db805f1621b6345d03b58a353dd6e0abef04b6f6a9d492ef2e2091", + "copied_sha256": "e2aa3e4ee2db805f1621b6345d03b58a353dd6e0abef04b6f6a9d492ef2e2091", + "bytes": 12268, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/3.png", + "source_sha256": "417cb5f55e4c131dbcbab78295da853bb3a1bb3be8e769d159b5e4da995f8be3", + "copied_sha256": "417cb5f55e4c131dbcbab78295da853bb3a1bb3be8e769d159b5e4da995f8be3", + "bytes": 14837, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/4.png", + "source_sha256": "c2686cda49c00606132d51d59b628a98c29db1a7efcdef262da6fda3c55574f5", + "copied_sha256": "c2686cda49c00606132d51d59b628a98c29db1a7efcdef262da6fda3c55574f5", + "bytes": 15551, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/5.png", + "source_sha256": "73523941e8867e9047cab7bdd0e983280d23aba6051f28254abe39f687b96f56", + "copied_sha256": "73523941e8867e9047cab7bdd0e983280d23aba6051f28254abe39f687b96f56", + "bytes": 17326, + "modification": null + }, + { + "path": "resource/plant/哈密瓜/icon.png", + "source_sha256": "a5dd6edc3e4c2efe7546b2eec53a84598153070092b244b87d6804bbd89c01f9", + "copied_sha256": "a5dd6edc3e4c2efe7546b2eec53a84598153070092b244b87d6804bbd89c01f9", + "bytes": 10784, + "modification": null + }, + { + "path": "resource/plant/园艺世/1.png", + "source_sha256": "aa9ab5450c0cf0db0d011e89184828b1c18a50878a614f4aad814b2d5048a126", + "copied_sha256": "aa9ab5450c0cf0db0d011e89184828b1c18a50878a614f4aad814b2d5048a126", + "bytes": 2111, + "modification": null + }, + { + "path": "resource/plant/园艺世/2.png", + "source_sha256": "b4eb08aca852b31b45f6c596e7bed0c3a041eb7daadeafef113580e26a7ceba7", + "copied_sha256": "b4eb08aca852b31b45f6c596e7bed0c3a041eb7daadeafef113580e26a7ceba7", + "bytes": 4567, + "modification": null + }, + { + "path": "resource/plant/园艺世/3.png", + "source_sha256": "63c059720d4f51b52d05861360f7c1a699cdcd189dd63d842e56ca30b99d2ed4", + "copied_sha256": "63c059720d4f51b52d05861360f7c1a699cdcd189dd63d842e56ca30b99d2ed4", + "bytes": 11842, + "modification": null + }, + { + "path": "resource/plant/园艺世/4.png", + "source_sha256": "d5952ce94bab423bff3239b8197e0484f05cab594ae3fb3bcccfb1ff9f54f403", + "copied_sha256": "d5952ce94bab423bff3239b8197e0484f05cab594ae3fb3bcccfb1ff9f54f403", + "bytes": 17996, + "modification": null + }, + { + "path": "resource/plant/园艺世/5.png", + "source_sha256": "f0d7c8954db4a034c27b200462470e0cae457109bc567e0c7527d078e02e6053", + "copied_sha256": "f0d7c8954db4a034c27b200462470e0cae457109bc567e0c7527d078e02e6053", + "bytes": 29200, + "modification": null + }, + { + "path": "resource/plant/园艺世/icon.png", + "source_sha256": "62cfbfafd48f213c19d5409a31362508e5a67d322751d36c93700629796ab18a", + "copied_sha256": "62cfbfafd48f213c19d5409a31362508e5a67d322751d36c93700629796ab18a", + "bytes": 31686, + "modification": null + }, + { + "path": "resource/plant/土豆/1.png", + "source_sha256": "90640b91dbb010e10cf084737a657776ea40fcaa0355c8764693ae3cac343d68", + "copied_sha256": "90640b91dbb010e10cf084737a657776ea40fcaa0355c8764693ae3cac343d68", + "bytes": 3406, + "modification": null + }, + { + "path": "resource/plant/土豆/2.png", + "source_sha256": "1dea8e35473fc312abf0a9cfc1049c70f68f2e70171238533ab3c85d1850cdb6", + "copied_sha256": "1dea8e35473fc312abf0a9cfc1049c70f68f2e70171238533ab3c85d1850cdb6", + "bytes": 6968, + "modification": null + }, + { + "path": "resource/plant/土豆/3.png", + "source_sha256": "69a33de3754a8b9a491a3ed59d5704f57ccd54c7b821a69e133a1826b43325cf", + "copied_sha256": "69a33de3754a8b9a491a3ed59d5704f57ccd54c7b821a69e133a1826b43325cf", + "bytes": 15425, + "modification": null + }, + { + "path": "resource/plant/土豆/4.png", + "source_sha256": "fbd3433c80a4a66f5ffcf88e7f05bbb187e593c4513d254f619a9dca3bfc01f0", + "copied_sha256": "fbd3433c80a4a66f5ffcf88e7f05bbb187e593c4513d254f619a9dca3bfc01f0", + "bytes": 16553, + "modification": null + }, + { + "path": "resource/plant/土豆/5.png", + "source_sha256": "8b1639f4686cc8a27478c0035866848573fc300b639e7350e0cb89f983e26e88", + "copied_sha256": "8b1639f4686cc8a27478c0035866848573fc300b639e7350e0cb89f983e26e88", + "bytes": 23467, + "modification": null + }, + { + "path": "resource/plant/土豆/icon.png", + "source_sha256": "81312cd03bccdf720c61aeb211aa1552d639900b9a3ae9d2fd944f89be8f2c97", + "copied_sha256": "81312cd03bccdf720c61aeb211aa1552d639900b9a3ae9d2fd944f89be8f2c97", + "bytes": 9312, + "modification": null + }, + { + "path": "resource/plant/大白菜/1.png", + "source_sha256": "f21fc639e3bea6023f1660b652bfdbd24d77384e6a17a9133fe28748bbb5744d", + "copied_sha256": "f21fc639e3bea6023f1660b652bfdbd24d77384e6a17a9133fe28748bbb5744d", + "bytes": 1916, + "modification": null + }, + { + "path": "resource/plant/大白菜/2.png", + "source_sha256": "5e8875bceebcff36f74322e3b2aa64fa63336b4a40138fc66a7b8437c3a45d3a", + "copied_sha256": "5e8875bceebcff36f74322e3b2aa64fa63336b4a40138fc66a7b8437c3a45d3a", + "bytes": 6113, + "modification": null + }, + { + "path": "resource/plant/大白菜/3.png", + "source_sha256": "ecaa0730d5e320a1035e622eba1a6c8f5ee30455405d48800a8ebbf6b50219c4", + "copied_sha256": "ecaa0730d5e320a1035e622eba1a6c8f5ee30455405d48800a8ebbf6b50219c4", + "bytes": 10943, + "modification": null + }, + { + "path": "resource/plant/大白菜/4.png", + "source_sha256": "8c9919cb875a3399c98d2f56550c9f5008eae823472020d1351f7e7569c4c144", + "copied_sha256": "8c9919cb875a3399c98d2f56550c9f5008eae823472020d1351f7e7569c4c144", + "bytes": 11114, + "modification": null + }, + { + "path": "resource/plant/大白菜/5.png", + "source_sha256": "24f5a86b0c2be512532f2413d6d8e8b60519daec1687790e41b6be361f9e3f40", + "copied_sha256": "24f5a86b0c2be512532f2413d6d8e8b60519daec1687790e41b6be361f9e3f40", + "bytes": 13322, + "modification": null + }, + { + "path": "resource/plant/大白菜/icon.png", + "source_sha256": "2f38b02ecb284a20ad1eef4dd65c845b5bee02497da7fb9568b3db1e67b0e1b1", + "copied_sha256": "2f38b02ecb284a20ad1eef4dd65c845b5bee02497da7fb9568b3db1e67b0e1b1", + "bytes": 12595, + "modification": null + }, + { + "path": "resource/plant/大蒜/1.png", + "source_sha256": "fe4fbce09d4d745f999b613d945ebc1e9233da84456e65a1bb997fc97f5a1f67", + "copied_sha256": "fe4fbce09d4d745f999b613d945ebc1e9233da84456e65a1bb997fc97f5a1f67", + "bytes": 4366, + "modification": null + }, + { + "path": "resource/plant/大蒜/2.png", + "source_sha256": "6f671f4a853501fd9a61c8f01dea70aeeda70482ccddd4c83d30a256e49b9c97", + "copied_sha256": "6f671f4a853501fd9a61c8f01dea70aeeda70482ccddd4c83d30a256e49b9c97", + "bytes": 7283, + "modification": null + }, + { + "path": "resource/plant/大蒜/3.png", + "source_sha256": "e904b29f1d9b26835d326609a63f11e0d9fa2655137a59a2a33b83a8c2edee76", + "copied_sha256": "e904b29f1d9b26835d326609a63f11e0d9fa2655137a59a2a33b83a8c2edee76", + "bytes": 12163, + "modification": null + }, + { + "path": "resource/plant/大蒜/4.png", + "source_sha256": "cce558d74dadd1b0d61767fabab8f15c29ee063bdd5151914de05503104c0f93", + "copied_sha256": "cce558d74dadd1b0d61767fabab8f15c29ee063bdd5151914de05503104c0f93", + "bytes": 15630, + "modification": null + }, + { + "path": "resource/plant/大蒜/5.png", + "source_sha256": "c216e3aa78aca61c80a6b6828ca9e8aec596090fdf9c149c1586399ceec536f2", + "copied_sha256": "c216e3aa78aca61c80a6b6828ca9e8aec596090fdf9c149c1586399ceec536f2", + "bytes": 17828, + "modification": null + }, + { + "path": "resource/plant/大蒜/icon.png", + "source_sha256": "716cc24764d083f9aa02a405c24f27e607161d86b7300baaaa20b777227c935d", + "copied_sha256": "716cc24764d083f9aa02a405c24f27e607161d86b7300baaaa20b777227c935d", + "bytes": 6975, + "modification": null + }, + { + "path": "resource/plant/富贵竹/1.png", + "source_sha256": "97b08fd5ff1d94b2750c0c45136c95b0dac23369efe12805748759a06423984a", + "copied_sha256": "97b08fd5ff1d94b2750c0c45136c95b0dac23369efe12805748759a06423984a", + "bytes": 1040, + "modification": null + }, + { + "path": "resource/plant/富贵竹/2.png", + "source_sha256": "a68dcf801f26a503ffcb41f06d414d82384111a5d725991d36cba11b2bb62df6", + "copied_sha256": "a68dcf801f26a503ffcb41f06d414d82384111a5d725991d36cba11b2bb62df6", + "bytes": 4315, + "modification": null + }, + { + "path": "resource/plant/富贵竹/3.png", + "source_sha256": "09a464c054b3bb0b6ed29a3debeeee74417301638d5d6072c8ae92be1d463a13", + "copied_sha256": "09a464c054b3bb0b6ed29a3debeeee74417301638d5d6072c8ae92be1d463a13", + "bytes": 9321, + "modification": null + }, + { + "path": "resource/plant/富贵竹/4.png", + "source_sha256": "811edb8c22798858e3572ec4260b957a9aac25c70b25ce9ffd357989fc907d79", + "copied_sha256": "811edb8c22798858e3572ec4260b957a9aac25c70b25ce9ffd357989fc907d79", + "bytes": 14435, + "modification": null + }, + { + "path": "resource/plant/富贵竹/5.png", + "source_sha256": "49887ea157c1d38ed44a22134c787047504095f480d341beacf8e938416a4190", + "copied_sha256": "49887ea157c1d38ed44a22134c787047504095f480d341beacf8e938416a4190", + "bytes": 26682, + "modification": null + }, + { + "path": "resource/plant/富贵竹/icon.png", + "source_sha256": "9df2688d0f4ea9b352e3347b982854af1e956068193c097a7a60bba23a3cdedb", + "copied_sha256": "9df2688d0f4ea9b352e3347b982854af1e956068193c097a7a60bba23a3cdedb", + "bytes": 18233, + "modification": null + }, + { + "path": "resource/plant/小白菜/1.png", + "source_sha256": "b49c2f942de76e46075ee18c0b0abf34dafd8dcae02cf0298692cb7aea5ba750", + "copied_sha256": "b49c2f942de76e46075ee18c0b0abf34dafd8dcae02cf0298692cb7aea5ba750", + "bytes": 1031, + "modification": null + }, + { + "path": "resource/plant/小白菜/2.png", + "source_sha256": "b8f5a211f90c881371d4f51476c579b625e82740a6f7e59902eec64c17f257bb", + "copied_sha256": "b8f5a211f90c881371d4f51476c579b625e82740a6f7e59902eec64c17f257bb", + "bytes": 4130, + "modification": null + }, + { + "path": "resource/plant/小白菜/3.png", + "source_sha256": "0e8105b45994155b95674fda949aaff0b6ec259e0d06fad1199a33fe463bfd5a", + "copied_sha256": "0e8105b45994155b95674fda949aaff0b6ec259e0d06fad1199a33fe463bfd5a", + "bytes": 13046, + "modification": null + }, + { + "path": "resource/plant/小白菜/4.png", + "source_sha256": "f879a0b07d43e6d4fca3122105d4de774b564095d49ef620a5fec5b9e849c375", + "copied_sha256": "f879a0b07d43e6d4fca3122105d4de774b564095d49ef620a5fec5b9e849c375", + "bytes": 14099, + "modification": null + }, + { + "path": "resource/plant/小白菜/icon.png", + "source_sha256": "4328dd3d1ae61a811d4dfd003110156fb8e1520c90129c19c5307112b43cdaa8", + "copied_sha256": "4328dd3d1ae61a811d4dfd003110156fb8e1520c90129c19c5307112b43cdaa8", + "bytes": 9742, + "modification": null + }, + { + "path": "resource/plant/小麦/1.png", + "source_sha256": "5883fd6220d7893eab3c0cdb80c55ebc8632d0dbaad24a7449efa3760c5c8f7f", + "copied_sha256": "5883fd6220d7893eab3c0cdb80c55ebc8632d0dbaad24a7449efa3760c5c8f7f", + "bytes": 1373, + "modification": null + }, + { + "path": "resource/plant/小麦/2.png", + "source_sha256": "18a63e04f978fddd7964c35979244b2cc7518e860a44ef4e90faaa06cbad9024", + "copied_sha256": "18a63e04f978fddd7964c35979244b2cc7518e860a44ef4e90faaa06cbad9024", + "bytes": 4240, + "modification": null + }, + { + "path": "resource/plant/小麦/3.png", + "source_sha256": "bf094c88ee84e392cc71673ef6b40b1262bb9b929ef2cc063cf10fc266142feb", + "copied_sha256": "bf094c88ee84e392cc71673ef6b40b1262bb9b929ef2cc063cf10fc266142feb", + "bytes": 7512, + "modification": null + }, + { + "path": "resource/plant/小麦/4.png", + "source_sha256": "0a1a529994d6b38114926c43195f23d1a43cd8223f6804f0ffb8a853c06f8c20", + "copied_sha256": "0a1a529994d6b38114926c43195f23d1a43cd8223f6804f0ffb8a853c06f8c20", + "bytes": 10641, + "modification": null + }, + { + "path": "resource/plant/小麦/5.png", + "source_sha256": "35853528cef793f746cfd957472e95e854f601ea86af0a3bfda79517ab6929a0", + "copied_sha256": "35853528cef793f746cfd957472e95e854f601ea86af0a3bfda79517ab6929a0", + "bytes": 13922, + "modification": null + }, + { + "path": "resource/plant/小麦/icon.png", + "source_sha256": "0b80564515c742e961010d99b4f6abd0958ea6238d1f8c4e669a6a198f2f42b9", + "copied_sha256": "0b80564515c742e961010d99b4f6abd0958ea6238d1f8c4e669a6a198f2f42b9", + "bytes": 9934, + "modification": null + }, + { + "path": "resource/plant/山竹/1.png", + "source_sha256": "2bce5723615971a0c1ef0e5a2479ca32bd16d154121e0a8a246641707d222385", + "copied_sha256": "2bce5723615971a0c1ef0e5a2479ca32bd16d154121e0a8a246641707d222385", + "bytes": 4598, + "modification": null + }, + { + "path": "resource/plant/山竹/2.png", + "source_sha256": "252637660273ccd13f19faae6d4537f9d6adc1b05d2fbb504dc8429c7dc14328", + "copied_sha256": "252637660273ccd13f19faae6d4537f9d6adc1b05d2fbb504dc8429c7dc14328", + "bytes": 11111, + "modification": null + }, + { + "path": "resource/plant/山竹/3.png", + "source_sha256": "b51e21a124c33ef660dc0a8404dbe130268bf99858ac462c7402652180bd7895", + "copied_sha256": "b51e21a124c33ef660dc0a8404dbe130268bf99858ac462c7402652180bd7895", + "bytes": 23064, + "modification": null + }, + { + "path": "resource/plant/山竹/4.png", + "source_sha256": "2e44afce34571872dd37516bd2fc13b57ad346188ac9645c69ed3e0bfd321dd1", + "copied_sha256": "2e44afce34571872dd37516bd2fc13b57ad346188ac9645c69ed3e0bfd321dd1", + "bytes": 26106, + "modification": null + }, + { + "path": "resource/plant/山竹/5.png", + "source_sha256": "3af58c53778deabf2c643541ddffe8ce9ea5005906ea29c33e211d825ff33ffd", + "copied_sha256": "3af58c53778deabf2c643541ddffe8ce9ea5005906ea29c33e211d825ff33ffd", + "bytes": 26200, + "modification": null + }, + { + "path": "resource/plant/山竹/icon.png", + "source_sha256": "7b8309360ecd4bf3f26b7aafb7058c43fbd6614a0316faed3c765372c6a69f49", + "copied_sha256": "7b8309360ecd4bf3f26b7aafb7058c43fbd6614a0316faed3c765372c6a69f49", + "bytes": 11560, + "modification": null + }, + { + "path": "resource/plant/无花果/1.png", + "source_sha256": "08e10b4373c36b9c544b6fec4e4088568a4ecff3e58aabf6a8917ed09ce58466", + "copied_sha256": "08e10b4373c36b9c544b6fec4e4088568a4ecff3e58aabf6a8917ed09ce58466", + "bytes": 1669, + "modification": null + }, + { + "path": "resource/plant/无花果/2.png", + "source_sha256": "c844f93163145fdada632e15822806a22c3c56fbdeede5dadf3c92df9f9a905f", + "copied_sha256": "c844f93163145fdada632e15822806a22c3c56fbdeede5dadf3c92df9f9a905f", + "bytes": 5296, + "modification": null + }, + { + "path": "resource/plant/无花果/3.png", + "source_sha256": "efb4fe6f325dddfb689acecc9e95d9dc0438ee7ef5b8ddd176b956835b02ebfe", + "copied_sha256": "efb4fe6f325dddfb689acecc9e95d9dc0438ee7ef5b8ddd176b956835b02ebfe", + "bytes": 14220, + "modification": null + }, + { + "path": "resource/plant/无花果/4.png", + "source_sha256": "b1624a555613d687b7868401f7151f3e4351b010cdeb1123af8fd3f993c86abe", + "copied_sha256": "b1624a555613d687b7868401f7151f3e4351b010cdeb1123af8fd3f993c86abe", + "bytes": 22604, + "modification": null + }, + { + "path": "resource/plant/无花果/5.png", + "source_sha256": "01648efa81b97857afdcb19680f54b2f5842c711b3273b05a6fb437b2d7dd2fd", + "copied_sha256": "01648efa81b97857afdcb19680f54b2f5842c711b3273b05a6fb437b2d7dd2fd", + "bytes": 24059, + "modification": null + }, + { + "path": "resource/plant/无花果/icon.png", + "source_sha256": "f4c52eadecc25fdb020ae1bbc0cf8c5ae6bc112661b37ff0c4366e6b1d8ccd04", + "copied_sha256": "f4c52eadecc25fdb020ae1bbc0cf8c5ae6bc112661b37ff0c4366e6b1d8ccd04", + "bytes": 8225, + "modification": null + }, + { + "path": "resource/plant/月柿/1.png", + "source_sha256": "c3c6be217b0253ec27062434ca7396c11e73ac05454b9eb515d7682b8680f97f", + "copied_sha256": "c3c6be217b0253ec27062434ca7396c11e73ac05454b9eb515d7682b8680f97f", + "bytes": 2174, + "modification": null + }, + { + "path": "resource/plant/月柿/2.png", + "source_sha256": "ec07f1ec163b8b5a5877c0dad783f3ddd166a49ccb2e219c8a9a03b2e8d6a450", + "copied_sha256": "ec07f1ec163b8b5a5877c0dad783f3ddd166a49ccb2e219c8a9a03b2e8d6a450", + "bytes": 10649, + "modification": null + }, + { + "path": "resource/plant/月柿/3.png", + "source_sha256": "4aec71a2a7b5e1429e27e36a2ffff694dd97711c81f1923f9d4cae5cc1a32531", + "copied_sha256": "4aec71a2a7b5e1429e27e36a2ffff694dd97711c81f1923f9d4cae5cc1a32531", + "bytes": 18868, + "modification": null + }, + { + "path": "resource/plant/月柿/4.png", + "source_sha256": "7cc2dd144b7a846a3a7f0f548c9400d90be838ab4b31cbb9c0d6345c1adb70a4", + "copied_sha256": "7cc2dd144b7a846a3a7f0f548c9400d90be838ab4b31cbb9c0d6345c1adb70a4", + "bytes": 23684, + "modification": null + }, + { + "path": "resource/plant/月柿/5.png", + "source_sha256": "8533c7965e707c999d3b4ac5b7d5c0c4d23c9c5adf3df50dbc00053ed2c1fd4b", + "copied_sha256": "8533c7965e707c999d3b4ac5b7d5c0c4d23c9c5adf3df50dbc00053ed2c1fd4b", + "bytes": 24282, + "modification": null + }, + { + "path": "resource/plant/月柿/icon.png", + "source_sha256": "e96a3afe563775b0362a5fdd2b546072096432f304c0cf16fdc2023196fcc9e2", + "copied_sha256": "e96a3afe563775b0362a5fdd2b546072096432f304c0cf16fdc2023196fcc9e2", + "bytes": 7899, + "modification": null + }, + { + "path": "resource/plant/木瓜/1.png", + "source_sha256": "0656a3f0be52e081ce87085689884a65ce1be441dea773ddb0e0c8e1ff9f0a20", + "copied_sha256": "0656a3f0be52e081ce87085689884a65ce1be441dea773ddb0e0c8e1ff9f0a20", + "bytes": 2912, + "modification": null + }, + { + "path": "resource/plant/木瓜/2.png", + "source_sha256": "b28f2056811282249db06ff6982b2b8a9aee596d0a636220ce2bb484bbe719f5", + "copied_sha256": "b28f2056811282249db06ff6982b2b8a9aee596d0a636220ce2bb484bbe719f5", + "bytes": 6297, + "modification": null + }, + { + "path": "resource/plant/木瓜/3.png", + "source_sha256": "2e9826c1bb1955bb0dd63e4d40bd3fe11865c538c8a4b0f1dcb0a5a0abeaddcb", + "copied_sha256": "2e9826c1bb1955bb0dd63e4d40bd3fe11865c538c8a4b0f1dcb0a5a0abeaddcb", + "bytes": 15511, + "modification": null + }, + { + "path": "resource/plant/木瓜/4.png", + "source_sha256": "c5fddc12f721fce13567d8438574216f2c75c4779bec3fffa9c6192048e9f1ad", + "copied_sha256": "c5fddc12f721fce13567d8438574216f2c75c4779bec3fffa9c6192048e9f1ad", + "bytes": 17744, + "modification": null + }, + { + "path": "resource/plant/木瓜/5.png", + "source_sha256": "5e44f2e61ffce1afb60cdebdfd77788b6d4223310eb57a33469edc78c8ebe7e7", + "copied_sha256": "5e44f2e61ffce1afb60cdebdfd77788b6d4223310eb57a33469edc78c8ebe7e7", + "bytes": 16919, + "modification": null + }, + { + "path": "resource/plant/木瓜/icon.png", + "source_sha256": "6f9bb3eae80a7815068e949afe26c77f80b8452fa80a85896614abbd02456537", + "copied_sha256": "6f9bb3eae80a7815068e949afe26c77f80b8452fa80a85896614abbd02456537", + "bytes": 10116, + "modification": null + }, + { + "path": "resource/plant/李子/1.png", + "source_sha256": "98cafe37c2c8bc0e9f108ccdc4564d58fcd31f1f0c24f00f3fc20a896be36728", + "copied_sha256": "98cafe37c2c8bc0e9f108ccdc4564d58fcd31f1f0c24f00f3fc20a896be36728", + "bytes": 831, + "modification": null + }, + { + "path": "resource/plant/李子/2.png", + "source_sha256": "fe4a5302d2c2655192e03e7a135398bf206a803e6ae26a07100ea360b8ecc8ac", + "copied_sha256": "fe4a5302d2c2655192e03e7a135398bf206a803e6ae26a07100ea360b8ecc8ac", + "bytes": 4239, + "modification": null + }, + { + "path": "resource/plant/李子/3.png", + "source_sha256": "a03b230085bfc4cc473c86a4a055f722649c504fbb168d1199652ba67f3c315c", + "copied_sha256": "a03b230085bfc4cc473c86a4a055f722649c504fbb168d1199652ba67f3c315c", + "bytes": 17864, + "modification": null + }, + { + "path": "resource/plant/李子/4.png", + "source_sha256": "b82dfdb582d7ffc05717ec499df35dff2a1fdb627398294b49a827aea792033e", + "copied_sha256": "b82dfdb582d7ffc05717ec499df35dff2a1fdb627398294b49a827aea792033e", + "bytes": 26107, + "modification": null + }, + { + "path": "resource/plant/李子/5.png", + "source_sha256": "421481fea1377808a9bf39c3b5fc2a6d12239e5149349fabbaf928800671bfbb", + "copied_sha256": "421481fea1377808a9bf39c3b5fc2a6d12239e5149349fabbaf928800671bfbb", + "bytes": 21556, + "modification": null + }, + { + "path": "resource/plant/李子/icon.png", + "source_sha256": "60a02dab5df46e220ff0be75d2db713916c1ec59cbf2a1b67b3ce6aa226e4122", + "copied_sha256": "60a02dab5df46e220ff0be75d2db713916c1ec59cbf2a1b67b3ce6aa226e4122", + "bytes": 11705, + "modification": null + }, + { + "path": "resource/plant/杏子/1.png", + "source_sha256": "24547cb06f1d83b9ee7a977a760da512ae94b0861733ff6cbfa5f108d84aafc3", + "copied_sha256": "24547cb06f1d83b9ee7a977a760da512ae94b0861733ff6cbfa5f108d84aafc3", + "bytes": 3139, + "modification": null + }, + { + "path": "resource/plant/杏子/2.png", + "source_sha256": "d151cb66f725ebacd671f782f805d57fb4921eb6e2e7597ddfae3c71ea95d279", + "copied_sha256": "d151cb66f725ebacd671f782f805d57fb4921eb6e2e7597ddfae3c71ea95d279", + "bytes": 14815, + "modification": null + }, + { + "path": "resource/plant/杏子/3.png", + "source_sha256": "03dafcff7f620964411bf7cc761ca017ff67388391d15f3153731315c91bf251", + "copied_sha256": "03dafcff7f620964411bf7cc761ca017ff67388391d15f3153731315c91bf251", + "bytes": 15811, + "modification": null + }, + { + "path": "resource/plant/杏子/4.png", + "source_sha256": "ee50bcf978cdb6f17ab4f448b80a30384223359b1ef3b758338f6485d7c080f6", + "copied_sha256": "ee50bcf978cdb6f17ab4f448b80a30384223359b1ef3b758338f6485d7c080f6", + "bytes": 19155, + "modification": null + }, + { + "path": "resource/plant/杏子/5.png", + "source_sha256": "757e4a6e9cdf948efa7b31b565424ea317abf41d99b2730ff730b30700596ad2", + "copied_sha256": "757e4a6e9cdf948efa7b31b565424ea317abf41d99b2730ff730b30700596ad2", + "bytes": 19706, + "modification": null + }, + { + "path": "resource/plant/杏子/icon.png", + "source_sha256": "c1a1347d7d32c0f958856080b61ebe7fa83c173b3da9f4e2747809f20db588fc", + "copied_sha256": "c1a1347d7d32c0f958856080b61ebe7fa83c173b3da9f4e2747809f20db588fc", + "bytes": 9644, + "modification": null + }, + { + "path": "resource/plant/杨桃/1.png", + "source_sha256": "38c3a743d835af31e7ebe449391f30cb91598c95fa30efb925c2d2a4a682bc43", + "copied_sha256": "38c3a743d835af31e7ebe449391f30cb91598c95fa30efb925c2d2a4a682bc43", + "bytes": 1353, + "modification": null + }, + { + "path": "resource/plant/杨桃/2.png", + "source_sha256": "9588a6c33b87f24f2b39a64a50d8852cbd64ead49d83b17383025eff2bc10e10", + "copied_sha256": "9588a6c33b87f24f2b39a64a50d8852cbd64ead49d83b17383025eff2bc10e10", + "bytes": 7779, + "modification": null + }, + { + "path": "resource/plant/杨桃/3.png", + "source_sha256": "9f2755680d7aca1907f3292a3916cea604871279dbe71cd8e7ac41bcd49a0f25", + "copied_sha256": "9f2755680d7aca1907f3292a3916cea604871279dbe71cd8e7ac41bcd49a0f25", + "bytes": 21585, + "modification": null + }, + { + "path": "resource/plant/杨桃/4.png", + "source_sha256": "5a5f8694d0ea2b9d2cf81a1c0156291cb5227ca12b444d1878b72da432ae4047", + "copied_sha256": "5a5f8694d0ea2b9d2cf81a1c0156291cb5227ca12b444d1878b72da432ae4047", + "bytes": 25201, + "modification": null + }, + { + "path": "resource/plant/杨桃/5.png", + "source_sha256": "2c589b9f82ab62898f7bf1474b8fdf1da14fc92b99fecb21ce5d21fd9a40b34a", + "copied_sha256": "2c589b9f82ab62898f7bf1474b8fdf1da14fc92b99fecb21ce5d21fd9a40b34a", + "bytes": 24267, + "modification": null + }, + { + "path": "resource/plant/杨桃/icon.png", + "source_sha256": "6cfe12632595a2ec0404d295d7f86804171fcc41a25c864d0cfc7699e7ca70fb", + "copied_sha256": "6cfe12632595a2ec0404d295d7f86804171fcc41a25c864d0cfc7699e7ca70fb", + "bytes": 8471, + "modification": null + }, + { + "path": "resource/plant/杨梅/1.png", + "source_sha256": "e1055ebf1c8cfff05e125201b0c762db7ea41f2a4c6468e49c61deb41bb3eb04", + "copied_sha256": "e1055ebf1c8cfff05e125201b0c762db7ea41f2a4c6468e49c61deb41bb3eb04", + "bytes": 1493, + "modification": null + }, + { + "path": "resource/plant/杨梅/2.png", + "source_sha256": "4aa64179780929c5f369476acd8ab6c19b42b68ac52684a1a74a0880987ee22c", + "copied_sha256": "4aa64179780929c5f369476acd8ab6c19b42b68ac52684a1a74a0880987ee22c", + "bytes": 9779, + "modification": null + }, + { + "path": "resource/plant/杨梅/3.png", + "source_sha256": "dfdf16de981e04644e7ed6cc5eeac92ed58f3351262384d15df8a9e77e3d4af1", + "copied_sha256": "dfdf16de981e04644e7ed6cc5eeac92ed58f3351262384d15df8a9e77e3d4af1", + "bytes": 22685, + "modification": null + }, + { + "path": "resource/plant/杨梅/4.png", + "source_sha256": "da2dff5da296195646fafc9e4461969dfd7b65a9d16093e101fbcad63f792d2e", + "copied_sha256": "da2dff5da296195646fafc9e4461969dfd7b65a9d16093e101fbcad63f792d2e", + "bytes": 26539, + "modification": null + }, + { + "path": "resource/plant/杨梅/5.png", + "source_sha256": "a7b8ea1ea6798b451ef6a618727966c63d47541c17e0c0ad118e734dfc18a5a5", + "copied_sha256": "a7b8ea1ea6798b451ef6a618727966c63d47541c17e0c0ad118e734dfc18a5a5", + "bytes": 24324, + "modification": null + }, + { + "path": "resource/plant/杨梅/icon.png", + "source_sha256": "9f274296080489dab5c7c38eb9a7466ed5a3004d638036850c971c341035dbd0", + "copied_sha256": "9f274296080489dab5c7c38eb9a7466ed5a3004d638036850c971c341035dbd0", + "bytes": 13379, + "modification": null + }, + { + "path": "resource/plant/枇杷/1.png", + "source_sha256": "286052d49c675c1b82e5fad055bf087dfe3394ffc66a967194aa11570219561a", + "copied_sha256": "286052d49c675c1b82e5fad055bf087dfe3394ffc66a967194aa11570219561a", + "bytes": 2057, + "modification": null + }, + { + "path": "resource/plant/枇杷/2.png", + "source_sha256": "e86c199ae0a9a34ec1a9ab30d7ee11f362c14df728f680657ca8c9c944bbc2ce", + "copied_sha256": "e86c199ae0a9a34ec1a9ab30d7ee11f362c14df728f680657ca8c9c944bbc2ce", + "bytes": 5770, + "modification": null + }, + { + "path": "resource/plant/枇杷/3.png", + "source_sha256": "79c24a14e067c802c9b185fcf99f82e2f48dfe1c494269d1610a90cecca10a9b", + "copied_sha256": "79c24a14e067c802c9b185fcf99f82e2f48dfe1c494269d1610a90cecca10a9b", + "bytes": 13960, + "modification": null + }, + { + "path": "resource/plant/枇杷/4.png", + "source_sha256": "465b8c6df55413c4d834b3990ae4d41a2e4e275d0807a0cdbff8651244725b6d", + "copied_sha256": "465b8c6df55413c4d834b3990ae4d41a2e4e275d0807a0cdbff8651244725b6d", + "bytes": 20188, + "modification": null + }, + { + "path": "resource/plant/枇杷/5.png", + "source_sha256": "3466dbe719f01df5afd442aca04383651fb3e97db804636b4f424a99c09c0e8b", + "copied_sha256": "3466dbe719f01df5afd442aca04383651fb3e97db804636b4f424a99c09c0e8b", + "bytes": 23372, + "modification": null + }, + { + "path": "resource/plant/枇杷/icon.png", + "source_sha256": "c3ae8df8df33cbc9abb7356397244ac1c5043b0bbbf153f9ca11c0ba1539e6f5", + "copied_sha256": "c3ae8df8df33cbc9abb7356397244ac1c5043b0bbbf153f9ca11c0ba1539e6f5", + "bytes": 13753, + "modification": null + }, + { + "path": "resource/plant/柚子/1.png", + "source_sha256": "44f6a6cfb3b47be10a4cd6955fbbf536d70317b0d7e6fad2306261ea24cd4c39", + "copied_sha256": "44f6a6cfb3b47be10a4cd6955fbbf536d70317b0d7e6fad2306261ea24cd4c39", + "bytes": 2664, + "modification": null + }, + { + "path": "resource/plant/柚子/2.png", + "source_sha256": "37ae5033869e1930f918c1df5a12ddcedf9e07460a01efc1dedd3e64aad95cc9", + "copied_sha256": "37ae5033869e1930f918c1df5a12ddcedf9e07460a01efc1dedd3e64aad95cc9", + "bytes": 9950, + "modification": null + }, + { + "path": "resource/plant/柚子/3.png", + "source_sha256": "06ae06206d89bbe85982f5f34a57da1733a3c7eff4d4bd70b052bd62669d693e", + "copied_sha256": "06ae06206d89bbe85982f5f34a57da1733a3c7eff4d4bd70b052bd62669d693e", + "bytes": 23667, + "modification": null + }, + { + "path": "resource/plant/柚子/4.png", + "source_sha256": "6a3981fddf6bdbe35ae49d3a459a958de9111ec5ea1c9979d3eb445600ad8b29", + "copied_sha256": "6a3981fddf6bdbe35ae49d3a459a958de9111ec5ea1c9979d3eb445600ad8b29", + "bytes": 27135, + "modification": null + }, + { + "path": "resource/plant/柚子/5.png", + "source_sha256": "bc3b7508bf5636fbdf8fd4f675df8561eadffbb19a841a198d4ccf7e1bcbe2f1", + "copied_sha256": "bc3b7508bf5636fbdf8fd4f675df8561eadffbb19a841a198d4ccf7e1bcbe2f1", + "bytes": 23192, + "modification": null + }, + { + "path": "resource/plant/柚子/icon.png", + "source_sha256": "aab5ca9887ca2ee930a08bdc5fe4a95aaa2b4895acd82d14d10868c0aaf645c2", + "copied_sha256": "aab5ca9887ca2ee930a08bdc5fe4a95aaa2b4895acd82d14d10868c0aaf645c2", + "bytes": 5284, + "modification": null + }, + { + "path": "resource/plant/柠檬/1.png", + "source_sha256": "346dfe310bd976088251cedc1f69bc33f640c062aa9d60f69b4eb0932e22808d", + "copied_sha256": "346dfe310bd976088251cedc1f69bc33f640c062aa9d60f69b4eb0932e22808d", + "bytes": 1380, + "modification": null + }, + { + "path": "resource/plant/柠檬/2.png", + "source_sha256": "aa47257d53f53a135d09325241bbdef7ac6349b146ade46e4478d377c936c0a2", + "copied_sha256": "aa47257d53f53a135d09325241bbdef7ac6349b146ade46e4478d377c936c0a2", + "bytes": 3316, + "modification": null + }, + { + "path": "resource/plant/柠檬/3.png", + "source_sha256": "be300a8be1bc6448e60d1d115fcbf809b92c63de173b1218e01d0820514263ea", + "copied_sha256": "be300a8be1bc6448e60d1d115fcbf809b92c63de173b1218e01d0820514263ea", + "bytes": 11927, + "modification": null + }, + { + "path": "resource/plant/柠檬/4.png", + "source_sha256": "630cdd5852744ba1e6174ec73ffdacdb6644954d0ab94c977938c1e1161755fa", + "copied_sha256": "630cdd5852744ba1e6174ec73ffdacdb6644954d0ab94c977938c1e1161755fa", + "bytes": 18813, + "modification": null + }, + { + "path": "resource/plant/柠檬/5.png", + "source_sha256": "c4ea033986a2efc1efd5bd6781b72f569cb07ac95d42f881fbe4b48974028815", + "copied_sha256": "c4ea033986a2efc1efd5bd6781b72f569cb07ac95d42f881fbe4b48974028815", + "bytes": 21332, + "modification": null + }, + { + "path": "resource/plant/柠檬/icon.png", + "source_sha256": "c4d3a8c19852859f2c75b8b1a4390bc864f389b49c64a97f08e51ada063fd105", + "copied_sha256": "c4d3a8c19852859f2c75b8b1a4390bc864f389b49c64a97f08e51ada063fd105", + "bytes": 19679, + "modification": null + }, + { + "path": "resource/plant/栗子/1.png", + "source_sha256": "c74ed652d4d2d48da6bfeeb1aeb36ac5da598486fd4825c20fd64f7bf57b0694", + "copied_sha256": "c74ed652d4d2d48da6bfeeb1aeb36ac5da598486fd4825c20fd64f7bf57b0694", + "bytes": 1921, + "modification": null + }, + { + "path": "resource/plant/栗子/2.png", + "source_sha256": "cba68c9034d987491fb49d58b8aa78dcf7ca725a22e45a4ac6350b6523ed4f0a", + "copied_sha256": "cba68c9034d987491fb49d58b8aa78dcf7ca725a22e45a4ac6350b6523ed4f0a", + "bytes": 4897, + "modification": null + }, + { + "path": "resource/plant/栗子/3.png", + "source_sha256": "f6587f6fe18c2db80e83b757ddbf0702b793a2006fb842357d9faddaad20b4cd", + "copied_sha256": "f6587f6fe18c2db80e83b757ddbf0702b793a2006fb842357d9faddaad20b4cd", + "bytes": 10975, + "modification": null + }, + { + "path": "resource/plant/栗子/4.png", + "source_sha256": "15197d9e2e4470a7c75478812e594d8d672671c95e71b7ea2ea52512db99b769", + "copied_sha256": "15197d9e2e4470a7c75478812e594d8d672671c95e71b7ea2ea52512db99b769", + "bytes": 25090, + "modification": null + }, + { + "path": "resource/plant/栗子/5.png", + "source_sha256": "58039c65fc280d3f876c5ad6b4b99709e66cca7cb108bcbc6f5c49df97ca53b4", + "copied_sha256": "58039c65fc280d3f876c5ad6b4b99709e66cca7cb108bcbc6f5c49df97ca53b4", + "bytes": 27016, + "modification": null + }, + { + "path": "resource/plant/栗子/icon.png", + "source_sha256": "0ebbf495f0b8dbfd1752901fb529aad85fce9fc417223dc1f0045b7b839374aa", + "copied_sha256": "0ebbf495f0b8dbfd1752901fb529aad85fce9fc417223dc1f0045b7b839374aa", + "bytes": 11658, + "modification": null + }, + { + "path": "resource/plant/核桃/1.png", + "source_sha256": "34974dff3ea5a18f0e141cd44c0ad1efd5440119e8b60ae2f395d1521bfc5aac", + "copied_sha256": "34974dff3ea5a18f0e141cd44c0ad1efd5440119e8b60ae2f395d1521bfc5aac", + "bytes": 2039, + "modification": null + }, + { + "path": "resource/plant/核桃/2.png", + "source_sha256": "062e2c9dc607d894395bfa209bbab92f6e6751dc6548203824caa426447c8e8f", + "copied_sha256": "062e2c9dc607d894395bfa209bbab92f6e6751dc6548203824caa426447c8e8f", + "bytes": 6647, + "modification": null + }, + { + "path": "resource/plant/核桃/3.png", + "source_sha256": "afcffc0cbd458ef2112cd8446e7dca3541734e6f3c274e4d06e0e40c4c22f4d5", + "copied_sha256": "afcffc0cbd458ef2112cd8446e7dca3541734e6f3c274e4d06e0e40c4c22f4d5", + "bytes": 15926, + "modification": null + }, + { + "path": "resource/plant/核桃/4.png", + "source_sha256": "9ffa676f2b2438419940f7cfcbfd47062b600e2062337c6d39f572f88a17d578", + "copied_sha256": "9ffa676f2b2438419940f7cfcbfd47062b600e2062337c6d39f572f88a17d578", + "bytes": 24723, + "modification": null + }, + { + "path": "resource/plant/核桃/5.png", + "source_sha256": "c839e21dcd3bca16d148acf0a26d1514b2761e52e257e370f7a7790ece3bbd2e", + "copied_sha256": "c839e21dcd3bca16d148acf0a26d1514b2761e52e257e370f7a7790ece3bbd2e", + "bytes": 23488, + "modification": null + }, + { + "path": "resource/plant/核桃/icon.png", + "source_sha256": "cd44515f455488ca77e8a06d550215a332acd44a9ec7fed2b9d936f9139f5da3", + "copied_sha256": "cd44515f455488ca77e8a06d550215a332acd44a9ec7fed2b9d936f9139f5da3", + "bytes": 14964, + "modification": null + }, + { + "path": "resource/plant/桂圆/1.png", + "source_sha256": "9d924c2c55fc9e2898e262df37101d1b23ebd8a9a3e98cbe4b13e218b05dea33", + "copied_sha256": "9d924c2c55fc9e2898e262df37101d1b23ebd8a9a3e98cbe4b13e218b05dea33", + "bytes": 1334, + "modification": null + }, + { + "path": "resource/plant/桂圆/2.png", + "source_sha256": "67a038f9799f7bd988d9b48513085df99c8a309b88f33d2f0ed5b2be96d24261", + "copied_sha256": "67a038f9799f7bd988d9b48513085df99c8a309b88f33d2f0ed5b2be96d24261", + "bytes": 3737, + "modification": null + }, + { + "path": "resource/plant/桂圆/3.png", + "source_sha256": "200589c8736f4a5e38edaa0b21bd324fe481604f06c575cf652c93a816754ace", + "copied_sha256": "200589c8736f4a5e38edaa0b21bd324fe481604f06c575cf652c93a816754ace", + "bytes": 13458, + "modification": null + }, + { + "path": "resource/plant/桂圆/4.png", + "source_sha256": "55c0d319be84ca549b1ca29fa7c47177d63533b8db7adc7537042076a320b986", + "copied_sha256": "55c0d319be84ca549b1ca29fa7c47177d63533b8db7adc7537042076a320b986", + "bytes": 21149, + "modification": null + }, + { + "path": "resource/plant/桂圆/5.png", + "source_sha256": "93ccc38bbe880570f8619a9a91fc714042bd1150a57aea127302aa3e4452e840", + "copied_sha256": "93ccc38bbe880570f8619a9a91fc714042bd1150a57aea127302aa3e4452e840", + "bytes": 22590, + "modification": null + }, + { + "path": "resource/plant/桂圆/icon.png", + "source_sha256": "b1498fb415e942018484f76ee10e6119e30d8df1a7a8d9f64ca3a2bfd29b7c33", + "copied_sha256": "b1498fb415e942018484f76ee10e6119e30d8df1a7a8d9f64ca3a2bfd29b7c33", + "bytes": 10442, + "modification": null + }, + { + "path": "resource/plant/桃子/1.png", + "source_sha256": "c50a819fc51453ae5944a9cadbf8ad6631d209137bc2e117da2055f323f8000e", + "copied_sha256": "c50a819fc51453ae5944a9cadbf8ad6631d209137bc2e117da2055f323f8000e", + "bytes": 2865, + "modification": null + }, + { + "path": "resource/plant/桃子/2.png", + "source_sha256": "87c5c2959df77af2ce2f1e5fdd2327aa5115173de3fb31dc35683c18c7bc2e11", + "copied_sha256": "87c5c2959df77af2ce2f1e5fdd2327aa5115173de3fb31dc35683c18c7bc2e11", + "bytes": 9678, + "modification": null + }, + { + "path": "resource/plant/桃子/3.png", + "source_sha256": "59acf7b4746949ac9cd1d61230a1f7b6d3edb94ec0d25c10b994c3e7a7475da3", + "copied_sha256": "59acf7b4746949ac9cd1d61230a1f7b6d3edb94ec0d25c10b994c3e7a7475da3", + "bytes": 15525, + "modification": null + }, + { + "path": "resource/plant/桃子/4.png", + "source_sha256": "0ce1e58539c2d4973950c7af57fea61b7342b3a22fd2f39bc40f22c167850c50", + "copied_sha256": "0ce1e58539c2d4973950c7af57fea61b7342b3a22fd2f39bc40f22c167850c50", + "bytes": 19723, + "modification": null + }, + { + "path": "resource/plant/桃子/5.png", + "source_sha256": "7759ec5cd17b1f5c2083e1aa20fae882f1902a98f13fbe79e3a512b03c025a24", + "copied_sha256": "7759ec5cd17b1f5c2083e1aa20fae882f1902a98f13fbe79e3a512b03c025a24", + "bytes": 19267, + "modification": null + }, + { + "path": "resource/plant/桃子/icon.png", + "source_sha256": "1554571946f38ef51e69a32938d909be205dbd10d8312ef6aa16801e4c172029", + "copied_sha256": "1554571946f38ef51e69a32938d909be205dbd10d8312ef6aa16801e4c172029", + "bytes": 7615, + "modification": null + }, + { + "path": "resource/plant/桑葚/1.png", + "source_sha256": "e4af4860940f4861037d0758c1b306e2f47a3c234c7432bcb17924324876aa0c", + "copied_sha256": "e4af4860940f4861037d0758c1b306e2f47a3c234c7432bcb17924324876aa0c", + "bytes": 2372, + "modification": null + }, + { + "path": "resource/plant/桑葚/2.png", + "source_sha256": "818d3746182fbc9b57b69699814513e3c8802f8bcbea94c1d45a5514e093c53e", + "copied_sha256": "818d3746182fbc9b57b69699814513e3c8802f8bcbea94c1d45a5514e093c53e", + "bytes": 5843, + "modification": null + }, + { + "path": "resource/plant/桑葚/3.png", + "source_sha256": "61fb6b1810b8ca8fb034f721f5adf0873a04c67e4f8cb9da98dddcd379cd2aed", + "copied_sha256": "61fb6b1810b8ca8fb034f721f5adf0873a04c67e4f8cb9da98dddcd379cd2aed", + "bytes": 15735, + "modification": null + }, + { + "path": "resource/plant/桑葚/4.png", + "source_sha256": "b5010c6ed58a1a1be2f0f4b08b07e8df6ce47dbfa4b9f0ad4add3ae13ec87b20", + "copied_sha256": "b5010c6ed58a1a1be2f0f4b08b07e8df6ce47dbfa4b9f0ad4add3ae13ec87b20", + "bytes": 20007, + "modification": null + }, + { + "path": "resource/plant/桑葚/5.png", + "source_sha256": "7a540d5b1c73f5a9dfe2c3979bbe2a54696b2edac418cc1ebf11346be6c58f46", + "copied_sha256": "7a540d5b1c73f5a9dfe2c3979bbe2a54696b2edac418cc1ebf11346be6c58f46", + "bytes": 24427, + "modification": null + }, + { + "path": "resource/plant/桑葚/icon.png", + "source_sha256": "b59e026d41fd79b2db6a96a4f1721ead48736dc1c53bffa3529faa7b5c422438", + "copied_sha256": "b59e026d41fd79b2db6a96a4f1721ead48736dc1c53bffa3529faa7b5c422438", + "bytes": 12982, + "modification": null + }, + { + "path": "resource/plant/梨/1.png", + "source_sha256": "b22336d469ecec23ab9e0c9c51f822977526c5720239b83e3e8d481b4f64fa03", + "copied_sha256": "b22336d469ecec23ab9e0c9c51f822977526c5720239b83e3e8d481b4f64fa03", + "bytes": 4012, + "modification": null + }, + { + "path": "resource/plant/梨/2.png", + "source_sha256": "85e04af6e7119afa658ba9eae36fe34e041fc982ec5f35ae958de92d5769b8f8", + "copied_sha256": "85e04af6e7119afa658ba9eae36fe34e041fc982ec5f35ae958de92d5769b8f8", + "bytes": 19115, + "modification": null + }, + { + "path": "resource/plant/梨/3.png", + "source_sha256": "b25b9f16d8415a13a6e6728d71ddec8dcd4380d157b6f940822d2c7eed37ee57", + "copied_sha256": "b25b9f16d8415a13a6e6728d71ddec8dcd4380d157b6f940822d2c7eed37ee57", + "bytes": 16389, + "modification": null + }, + { + "path": "resource/plant/梨/4.png", + "source_sha256": "da7df2f49f62c7de5deef5ad89282694bebdc16a7f6b12f4de7099f6304fa08b", + "copied_sha256": "da7df2f49f62c7de5deef5ad89282694bebdc16a7f6b12f4de7099f6304fa08b", + "bytes": 15007, + "modification": null + }, + { + "path": "resource/plant/梨/5.png", + "source_sha256": "ca1e7348c8b932caf921a939503b75c407940277cf6abff1208c7d9d21ee36a3", + "copied_sha256": "ca1e7348c8b932caf921a939503b75c407940277cf6abff1208c7d9d21ee36a3", + "bytes": 21761, + "modification": null + }, + { + "path": "resource/plant/梨/icon.png", + "source_sha256": "c036c59b9f73265616059e16045414fd1581053ecb1ec3d29868f88dd8e6ae02", + "copied_sha256": "c036c59b9f73265616059e16045414fd1581053ecb1ec3d29868f88dd8e6ae02", + "bytes": 7506, + "modification": null + }, + { + "path": "resource/plant/椰子/1.png", + "source_sha256": "af1a0c2da0c515ec04e748f1c8a0bda3f7c7f8896c59752b48b74d76ed0c51cd", + "copied_sha256": "af1a0c2da0c515ec04e748f1c8a0bda3f7c7f8896c59752b48b74d76ed0c51cd", + "bytes": 1854, + "modification": null + }, + { + "path": "resource/plant/椰子/2.png", + "source_sha256": "f00c8d41de74b53c7d58565590739f49f5f8c9f316827cb4ca12f04ab6562f54", + "copied_sha256": "f00c8d41de74b53c7d58565590739f49f5f8c9f316827cb4ca12f04ab6562f54", + "bytes": 12536, + "modification": null + }, + { + "path": "resource/plant/椰子/3.png", + "source_sha256": "f866bd18dde10b3b69b3788188a7a09bd1e9c9ba7d8287c01019e93ac5354324", + "copied_sha256": "f866bd18dde10b3b69b3788188a7a09bd1e9c9ba7d8287c01019e93ac5354324", + "bytes": 20870, + "modification": null + }, + { + "path": "resource/plant/椰子/4.png", + "source_sha256": "08053c89d953e8d0278376c8e2b64d9dfd587ee44bf21f9ea9e27d54047318f9", + "copied_sha256": "08053c89d953e8d0278376c8e2b64d9dfd587ee44bf21f9ea9e27d54047318f9", + "bytes": 21840, + "modification": null + }, + { + "path": "resource/plant/椰子/5.png", + "source_sha256": "8dcec7c86f93cbf284941422003df7314c7c49208251d9946264440e602c3ff8", + "copied_sha256": "8dcec7c86f93cbf284941422003df7314c7c49208251d9946264440e602c3ff8", + "bytes": 22045, + "modification": null + }, + { + "path": "resource/plant/椰子/icon.png", + "source_sha256": "680e371ec17489c49564dcd532c8c53b8e36a84c823282d48e0ae43977e7ef0a", + "copied_sha256": "680e371ec17489c49564dcd532c8c53b8e36a84c823282d48e0ae43977e7ef0a", + "bytes": 5427, + "modification": null + }, + { + "path": "resource/plant/榅桲/1.png", + "source_sha256": "63d469dd7ddb87840ae9dcbdb03280dfe148fae2a8fa9ccaad0bc6da4c8abc96", + "copied_sha256": "63d469dd7ddb87840ae9dcbdb03280dfe148fae2a8fa9ccaad0bc6da4c8abc96", + "bytes": 2597, + "modification": null + }, + { + "path": "resource/plant/榅桲/2.png", + "source_sha256": "fcc8f41bf4ccfe76cd613d244b60a1e6c89bb917ed63d879f96d4c6bc8959794", + "copied_sha256": "fcc8f41bf4ccfe76cd613d244b60a1e6c89bb917ed63d879f96d4c6bc8959794", + "bytes": 9039, + "modification": null + }, + { + "path": "resource/plant/榅桲/3.png", + "source_sha256": "0dca43a66b177f4c280e766f8bb78bf22c6dc25b9e8f12ea377732ce55f36cfa", + "copied_sha256": "0dca43a66b177f4c280e766f8bb78bf22c6dc25b9e8f12ea377732ce55f36cfa", + "bytes": 22473, + "modification": null + }, + { + "path": "resource/plant/榅桲/4.png", + "source_sha256": "de85f16c99bfe26dfb39b4a9e59454a28ab296a0670f874722decb40998ef58a", + "copied_sha256": "de85f16c99bfe26dfb39b4a9e59454a28ab296a0670f874722decb40998ef58a", + "bytes": 26715, + "modification": null + }, + { + "path": "resource/plant/榅桲/5.png", + "source_sha256": "ba37f79b94f6b921e9876fd2f8dc38acd248c05b051448ec00d6739e1fc36820", + "copied_sha256": "ba37f79b94f6b921e9876fd2f8dc38acd248c05b051448ec00d6739e1fc36820", + "bytes": 27676, + "modification": null + }, + { + "path": "resource/plant/榅桲/icon.png", + "source_sha256": "af1e97047e3d819736a032704e2ba1b9e89606236c983a553fb2164ae7e8738b", + "copied_sha256": "af1e97047e3d819736a032704e2ba1b9e89606236c983a553fb2164ae7e8738b", + "bytes": 11313, + "modification": null + }, + { + "path": "resource/plant/榛子/1.png", + "source_sha256": "57823524c2b59c12b3a7d181f4d20af6105daaa1718da051c70ca4068904e57e", + "copied_sha256": "57823524c2b59c12b3a7d181f4d20af6105daaa1718da051c70ca4068904e57e", + "bytes": 1347, + "modification": null + }, + { + "path": "resource/plant/榛子/2.png", + "source_sha256": "8d2cbe6d8ddfc309c24b2628e562f5d064861b4de1cb6268559274142068d10f", + "copied_sha256": "8d2cbe6d8ddfc309c24b2628e562f5d064861b4de1cb6268559274142068d10f", + "bytes": 12277, + "modification": null + }, + { + "path": "resource/plant/榛子/3.png", + "source_sha256": "684359711a897fca5faebf76e0ee3a07fedfca6f7ca41a197a467af8e28a6dac", + "copied_sha256": "684359711a897fca5faebf76e0ee3a07fedfca6f7ca41a197a467af8e28a6dac", + "bytes": 18848, + "modification": null + }, + { + "path": "resource/plant/榛子/4.png", + "source_sha256": "5d9655472465952bf09b35fe0e6a126237597ebdd1a3ff9d32d88e2ee794b890", + "copied_sha256": "5d9655472465952bf09b35fe0e6a126237597ebdd1a3ff9d32d88e2ee794b890", + "bytes": 21665, + "modification": null + }, + { + "path": "resource/plant/榛子/5.png", + "source_sha256": "546cbcf436a582c1d8101831c0c7c60185a8ffd00bdda33d1ffe8aa6729fc328", + "copied_sha256": "546cbcf436a582c1d8101831c0c7c60185a8ffd00bdda33d1ffe8aa6729fc328", + "bytes": 25359, + "modification": null + }, + { + "path": "resource/plant/榛子/icon.png", + "source_sha256": "252bb76bafadafbc806b3465b9cb7524ac533588560a8a3e6f42c4790e6396c3", + "copied_sha256": "252bb76bafadafbc806b3465b9cb7524ac533588560a8a3e6f42c4790e6396c3", + "bytes": 11494, + "modification": null + }, + { + "path": "resource/plant/榴莲/1.png", + "source_sha256": "069cfb168b19dda7e42bc9fc80a389013a0a187eb1a064442b0344172c447a6e", + "copied_sha256": "069cfb168b19dda7e42bc9fc80a389013a0a187eb1a064442b0344172c447a6e", + "bytes": 2414, + "modification": null + }, + { + "path": "resource/plant/榴莲/2.png", + "source_sha256": "4d76eac2c861474420e631d98433a2a3bfab3fc80a19078262b7ac5faa136086", + "copied_sha256": "4d76eac2c861474420e631d98433a2a3bfab3fc80a19078262b7ac5faa136086", + "bytes": 6435, + "modification": null + }, + { + "path": "resource/plant/榴莲/3.png", + "source_sha256": "656bb4cf69bc0b4211afc3e479ba80f908212ff6077d60d68d8945f2d704ec67", + "copied_sha256": "656bb4cf69bc0b4211afc3e479ba80f908212ff6077d60d68d8945f2d704ec67", + "bytes": 19568, + "modification": null + }, + { + "path": "resource/plant/榴莲/4.png", + "source_sha256": "421d013823ca76bc021ab35ecbb9edd1dfc33f227c0c51b285e924878505de80", + "copied_sha256": "421d013823ca76bc021ab35ecbb9edd1dfc33f227c0c51b285e924878505de80", + "bytes": 21309, + "modification": null + }, + { + "path": "resource/plant/榴莲/5.png", + "source_sha256": "4cffb0f238873bae35e96ce4e34bd0ee7ca141a15dc8c9de67681dd900427c10", + "copied_sha256": "4cffb0f238873bae35e96ce4e34bd0ee7ca141a15dc8c9de67681dd900427c10", + "bytes": 25637, + "modification": null + }, + { + "path": "resource/plant/榴莲/icon.png", + "source_sha256": "9e3deb57760570d9c3012abdbfb96244ff62b7e22bfe050a20de3bbe1ded9d88", + "copied_sha256": "9e3deb57760570d9c3012abdbfb96244ff62b7e22bfe050a20de3bbe1ded9d88", + "bytes": 17959, + "modification": null + }, + { + "path": "resource/plant/樱桃/1.png", + "source_sha256": "f83084bc0c3f655f904074ab0a946ca0858127169ac3c6964b90b19fe2441704", + "copied_sha256": "f83084bc0c3f655f904074ab0a946ca0858127169ac3c6964b90b19fe2441704", + "bytes": 2030, + "modification": null + }, + { + "path": "resource/plant/樱桃/2.png", + "source_sha256": "9b62a5ce236a3793d4bc65d2509a48f5421fdb401699785312215f0a3b2e63b9", + "copied_sha256": "9b62a5ce236a3793d4bc65d2509a48f5421fdb401699785312215f0a3b2e63b9", + "bytes": 7425, + "modification": null + }, + { + "path": "resource/plant/樱桃/3.png", + "source_sha256": "6cf8d0f8825fdcc5de1026a3f867b3fa29933828bc64c6b32f95864e51425834", + "copied_sha256": "6cf8d0f8825fdcc5de1026a3f867b3fa29933828bc64c6b32f95864e51425834", + "bytes": 15416, + "modification": null + }, + { + "path": "resource/plant/樱桃/4.png", + "source_sha256": "50629768570c1c27dbe1c63fb3d8c37ad31500c12133303282c3901848c2917f", + "copied_sha256": "50629768570c1c27dbe1c63fb3d8c37ad31500c12133303282c3901848c2917f", + "bytes": 20068, + "modification": null + }, + { + "path": "resource/plant/樱桃/5.png", + "source_sha256": "5b47c81b741383a8ec2fbeb6cb957ee2a8efcef07b27375f57b61d6eaa9d5e18", + "copied_sha256": "5b47c81b741383a8ec2fbeb6cb957ee2a8efcef07b27375f57b61d6eaa9d5e18", + "bytes": 20915, + "modification": null + }, + { + "path": "resource/plant/樱桃/icon.png", + "source_sha256": "e0847763add698cfbff5ba01c593e5c48e51c20cb49e4c520ee3d25ff049279b", + "copied_sha256": "e0847763add698cfbff5ba01c593e5c48e51c20cb49e4c520ee3d25ff049279b", + "bytes": 12220, + "modification": null + }, + { + "path": "resource/plant/橄榄/1.png", + "source_sha256": "d228b817f50c0b515e665bf36b169fd81a3cdb00afde9adb026e66132323d2cb", + "copied_sha256": "d228b817f50c0b515e665bf36b169fd81a3cdb00afde9adb026e66132323d2cb", + "bytes": 834, + "modification": null + }, + { + "path": "resource/plant/橄榄/2.png", + "source_sha256": "4c96df4a661164f805a566f5751f6a6cfa57459e3cfb62fc52fd818e4cd1603c", + "copied_sha256": "4c96df4a661164f805a566f5751f6a6cfa57459e3cfb62fc52fd818e4cd1603c", + "bytes": 2497, + "modification": null + }, + { + "path": "resource/plant/橄榄/3.png", + "source_sha256": "0e89a032b844ea12473470041f705eb7bfb1323cfbcd5684de3c8a89fadbaadf", + "copied_sha256": "0e89a032b844ea12473470041f705eb7bfb1323cfbcd5684de3c8a89fadbaadf", + "bytes": 13240, + "modification": null + }, + { + "path": "resource/plant/橄榄/4.png", + "source_sha256": "5b71a2dd245498f03ea64e5607940a10badf6905eb4fa00bdde7526a9c23456c", + "copied_sha256": "5b71a2dd245498f03ea64e5607940a10badf6905eb4fa00bdde7526a9c23456c", + "bytes": 25971, + "modification": null + }, + { + "path": "resource/plant/橄榄/5.png", + "source_sha256": "2cbe55864dccf267849ac570d95b5b3dce3764c399a7d3242d1a780a78671536", + "copied_sha256": "2cbe55864dccf267849ac570d95b5b3dce3764c399a7d3242d1a780a78671536", + "bytes": 26058, + "modification": null + }, + { + "path": "resource/plant/橄榄/icon.png", + "source_sha256": "cc11e206890c9a73781e2caf094b6374789c1912b0cc531db754df22032d3d5a", + "copied_sha256": "cc11e206890c9a73781e2caf094b6374789c1912b0cc531db754df22032d3d5a", + "bytes": 8087, + "modification": null + }, + { + "path": "resource/plant/橙子/1.png", + "source_sha256": "a457199742ec00115c8a79f5023b26d012ff9104439d9246b08bb9f1c5a6bada", + "copied_sha256": "a457199742ec00115c8a79f5023b26d012ff9104439d9246b08bb9f1c5a6bada", + "bytes": 2011, + "modification": null + }, + { + "path": "resource/plant/橙子/2.png", + "source_sha256": "606959efc3385e4262339d3afc907f58a051fb2b23d19fc9104721ef89d9eb8e", + "copied_sha256": "606959efc3385e4262339d3afc907f58a051fb2b23d19fc9104721ef89d9eb8e", + "bytes": 4777, + "modification": null + }, + { + "path": "resource/plant/橙子/3.png", + "source_sha256": "a17e0a18c50d9e2bf6d6af43d903c2ab660f45255faee7152070265be2a02771", + "copied_sha256": "a17e0a18c50d9e2bf6d6af43d903c2ab660f45255faee7152070265be2a02771", + "bytes": 14752, + "modification": null + }, + { + "path": "resource/plant/橙子/4.png", + "source_sha256": "9158b672b6d6b14888ff65256bd1018ddb42815abc01d3070328d37ff5989341", + "copied_sha256": "9158b672b6d6b14888ff65256bd1018ddb42815abc01d3070328d37ff5989341", + "bytes": 19669, + "modification": null + }, + { + "path": "resource/plant/橙子/5.png", + "source_sha256": "49e262b08f18f34184d476bb679d37788b456aa7573d842c8a2db877b93c7b22", + "copied_sha256": "49e262b08f18f34184d476bb679d37788b456aa7573d842c8a2db877b93c7b22", + "bytes": 16292, + "modification": null + }, + { + "path": "resource/plant/橙子/icon.png", + "source_sha256": "d0f4b065f3c68793f7e8b50f942f2b15b3a8b80dc356fe3cf754b50927826c34", + "copied_sha256": "d0f4b065f3c68793f7e8b50f942f2b15b3a8b80dc356fe3cf754b50927826c34", + "bytes": 5408, + "modification": null + }, + { + "path": "resource/plant/水稻/1.png", + "source_sha256": "9d59469abe1398826a6140e39a7f16147a8b2bf58c73580d9a5864977ccc0696", + "copied_sha256": "9d59469abe1398826a6140e39a7f16147a8b2bf58c73580d9a5864977ccc0696", + "bytes": 11892, + "modification": null + }, + { + "path": "resource/plant/水稻/2.png", + "source_sha256": "a23e9b2c9c7576215f490957a0b2885387bacb90bfedbe183fe4d9472d3d77f4", + "copied_sha256": "a23e9b2c9c7576215f490957a0b2885387bacb90bfedbe183fe4d9472d3d77f4", + "bytes": 14298, + "modification": null + }, + { + "path": "resource/plant/水稻/3.png", + "source_sha256": "fa9243f259bdf6f67cf87948a52f23969990c2c79209efd06fef33f4e18b18db", + "copied_sha256": "fa9243f259bdf6f67cf87948a52f23969990c2c79209efd06fef33f4e18b18db", + "bytes": 22624, + "modification": null + }, + { + "path": "resource/plant/水稻/4.png", + "source_sha256": "dce2247d47967c44edea8b298a0ad653347f126351d3c8cc7dccc3a1c5e31ba2", + "copied_sha256": "dce2247d47967c44edea8b298a0ad653347f126351d3c8cc7dccc3a1c5e31ba2", + "bytes": 17692, + "modification": null + }, + { + "path": "resource/plant/水稻/5.png", + "source_sha256": "c07e7dc220b78c3d68b12c6059cf0398dab34643b0f108a0dfe07c4b04ec9e51", + "copied_sha256": "c07e7dc220b78c3d68b12c6059cf0398dab34643b0f108a0dfe07c4b04ec9e51", + "bytes": 23424, + "modification": null + }, + { + "path": "resource/plant/水稻/icon.png", + "source_sha256": "716a384e906552ffd6a1840530f0c92a38a1c182445c3367847cf418dbf55413", + "copied_sha256": "716a384e906552ffd6a1840530f0c92a38a1c182445c3367847cf418dbf55413", + "bytes": 11412, + "modification": null + }, + { + "path": "resource/plant/沙棘/1.png", + "source_sha256": "2f874ca2c46c36f907f0a9add7bcd997add2dc103f35752c19f8e4a743defeff", + "copied_sha256": "2f874ca2c46c36f907f0a9add7bcd997add2dc103f35752c19f8e4a743defeff", + "bytes": 3765, + "modification": null + }, + { + "path": "resource/plant/沙棘/2.png", + "source_sha256": "db748357faad71fca5e11f8ec53785ba3255ce39658ac0d6b35230fe115f106f", + "copied_sha256": "db748357faad71fca5e11f8ec53785ba3255ce39658ac0d6b35230fe115f106f", + "bytes": 9274, + "modification": null + }, + { + "path": "resource/plant/沙棘/3.png", + "source_sha256": "946a9e346d433d1b9d79a34145efbfacac6e681ece32ed5d33bdc4d02e688e58", + "copied_sha256": "946a9e346d433d1b9d79a34145efbfacac6e681ece32ed5d33bdc4d02e688e58", + "bytes": 17163, + "modification": null + }, + { + "path": "resource/plant/沙棘/4.png", + "source_sha256": "560d6830fc7ffb78cfa2f73697c83431124d3aca634895ae7561dbc3022d5193", + "copied_sha256": "560d6830fc7ffb78cfa2f73697c83431124d3aca634895ae7561dbc3022d5193", + "bytes": 23258, + "modification": null + }, + { + "path": "resource/plant/沙棘/5.png", + "source_sha256": "edbf521399206ac3af3db272d9a9e5edf242c8c9ee260fd057991eb113ad96dc", + "copied_sha256": "edbf521399206ac3af3db272d9a9e5edf242c8c9ee260fd057991eb113ad96dc", + "bytes": 23972, + "modification": null + }, + { + "path": "resource/plant/沙棘/icon.png", + "source_sha256": "d6311cb8e16fb96232c695de7b782009af7bb87d8c0febc7b796143c89c1846a", + "copied_sha256": "d6311cb8e16fb96232c695de7b782009af7bb87d8c0febc7b796143c89c1846a", + "bytes": 13497, + "modification": null + }, + { + "path": "resource/plant/油菜/1.png", + "source_sha256": "70f703c8a1782501341f1c231f45aeea58109b4eaf20185fd0eec4986dbb24c2", + "copied_sha256": "70f703c8a1782501341f1c231f45aeea58109b4eaf20185fd0eec4986dbb24c2", + "bytes": 1286, + "modification": null + }, + { + "path": "resource/plant/油菜/2.png", + "source_sha256": "07b03cb0b2a26ab10f3f850197ac387f87e3f86fdb33a49c2bfabcb17a23c20f", + "copied_sha256": "07b03cb0b2a26ab10f3f850197ac387f87e3f86fdb33a49c2bfabcb17a23c20f", + "bytes": 4128, + "modification": null + }, + { + "path": "resource/plant/油菜/3.png", + "source_sha256": "5e2afe2d8ea659add5f61c01b581b0b9b42c7f6082dc3b0b898ca6fd486f6c60", + "copied_sha256": "5e2afe2d8ea659add5f61c01b581b0b9b42c7f6082dc3b0b898ca6fd486f6c60", + "bytes": 8118, + "modification": null + }, + { + "path": "resource/plant/油菜/4.png", + "source_sha256": "328998162674fa7db4dd1caf55214b59d7c4b5c86545c15456c0525884392e55", + "copied_sha256": "328998162674fa7db4dd1caf55214b59d7c4b5c86545c15456c0525884392e55", + "bytes": 14815, + "modification": null + }, + { + "path": "resource/plant/油菜/icon.png", + "source_sha256": "933a6980d88008c67d13d19deadd5390aa4c4c926556b420ce8ee23cf2882665", + "copied_sha256": "933a6980d88008c67d13d19deadd5390aa4c4c926556b420ce8ee23cf2882665", + "bytes": 8044, + "modification": null + }, + { + "path": "resource/plant/火龙果/1.png", + "source_sha256": "19b6b4b69d030d311449dbf1d4dc25e1ec8d2c0445a44fe6b0e789c103cce751", + "copied_sha256": "19b6b4b69d030d311449dbf1d4dc25e1ec8d2c0445a44fe6b0e789c103cce751", + "bytes": 1153, + "modification": null + }, + { + "path": "resource/plant/火龙果/2.png", + "source_sha256": "099efff46a25a31aefa1cf375591e0f144043b6cdfeab99c87993cf3da14976a", + "copied_sha256": "099efff46a25a31aefa1cf375591e0f144043b6cdfeab99c87993cf3da14976a", + "bytes": 2788, + "modification": null + }, + { + "path": "resource/plant/火龙果/3.png", + "source_sha256": "0ac5b5151c3b555ee9d3c638a271c59eecb0e5e6ae0610171d76e1daec7b4001", + "copied_sha256": "0ac5b5151c3b555ee9d3c638a271c59eecb0e5e6ae0610171d76e1daec7b4001", + "bytes": 13986, + "modification": null + }, + { + "path": "resource/plant/火龙果/4.png", + "source_sha256": "7a6280420c6a203b1ba95160d30e91d66ff4e03cc37dd57190174843d19117d8", + "copied_sha256": "7a6280420c6a203b1ba95160d30e91d66ff4e03cc37dd57190174843d19117d8", + "bytes": 20117, + "modification": null + }, + { + "path": "resource/plant/火龙果/5.png", + "source_sha256": "ee95b3b0706f6b0729c677e52f86835022ab2fe93a460bb8acc99667190b7703", + "copied_sha256": "ee95b3b0706f6b0729c677e52f86835022ab2fe93a460bb8acc99667190b7703", + "bytes": 20244, + "modification": null + }, + { + "path": "resource/plant/火龙果/icon.png", + "source_sha256": "d1085ac11285c860f3ef922007c84846534369c712631b721ba3d62d62e8244b", + "copied_sha256": "d1085ac11285c860f3ef922007c84846534369c712631b721ba3d62d62e8244b", + "bytes": 10376, + "modification": null + }, + { + "path": "resource/plant/灯笼果/1.png", + "source_sha256": "29071a6239ff7c7d90a41cf1ad2a368fae8a5ce42e3bcf8e29d0d60b8da8f23c", + "copied_sha256": "29071a6239ff7c7d90a41cf1ad2a368fae8a5ce42e3bcf8e29d0d60b8da8f23c", + "bytes": 2989, + "modification": null + }, + { + "path": "resource/plant/灯笼果/2.png", + "source_sha256": "2d758cfdc362d6e339462feae7279d2c3148922ddc0e635c5c4b38d52a934976", + "copied_sha256": "2d758cfdc362d6e339462feae7279d2c3148922ddc0e635c5c4b38d52a934976", + "bytes": 8193, + "modification": null + }, + { + "path": "resource/plant/灯笼果/3.png", + "source_sha256": "40638f68053c5e13a177a274cb1bd799ffeec229a0a050fd055fe752e8efcf80", + "copied_sha256": "40638f68053c5e13a177a274cb1bd799ffeec229a0a050fd055fe752e8efcf80", + "bytes": 18116, + "modification": null + }, + { + "path": "resource/plant/灯笼果/4.png", + "source_sha256": "72eecf4ff531fc9fb43fd5e25d2188f00db08d117225a1a56bf767f98be945c8", + "copied_sha256": "72eecf4ff531fc9fb43fd5e25d2188f00db08d117225a1a56bf767f98be945c8", + "bytes": 22463, + "modification": null + }, + { + "path": "resource/plant/灯笼果/5.png", + "source_sha256": "1663582e1cc5e4bc894b366b43cde2fc32ec7d572b220cc0b4aaed861f5ffe9f", + "copied_sha256": "1663582e1cc5e4bc894b366b43cde2fc32ec7d572b220cc0b4aaed861f5ffe9f", + "bytes": 27744, + "modification": null + }, + { + "path": "resource/plant/灯笼果/icon.png", + "source_sha256": "47ed2b946f49cb4c55ca0898f2b1488c33b412fdf2eec81781c738cafd00d086", + "copied_sha256": "47ed2b946f49cb4c55ca0898f2b1488c33b412fdf2eec81781c738cafd00d086", + "bytes": 9457, + "modification": null + }, + { + "path": "resource/plant/点地梅/1.png", + "source_sha256": "a92dcc6dd4bd1e76b38bc139b6153ec0b7751b57348a62ff2d254f55cfd77d39", + "copied_sha256": "a92dcc6dd4bd1e76b38bc139b6153ec0b7751b57348a62ff2d254f55cfd77d39", + "bytes": 1856, + "modification": null + }, + { + "path": "resource/plant/点地梅/2.png", + "source_sha256": "6ffd408b3aa47270d823baefb604b4d85004c82b9083adb247a8e6c45785edc2", + "copied_sha256": "6ffd408b3aa47270d823baefb604b4d85004c82b9083adb247a8e6c45785edc2", + "bytes": 6037, + "modification": null + }, + { + "path": "resource/plant/点地梅/3.png", + "source_sha256": "0ffb466ff4f52d0392348da29b7aebb364f245ef6c43f882ad13aa23ab0e0352", + "copied_sha256": "0ffb466ff4f52d0392348da29b7aebb364f245ef6c43f882ad13aa23ab0e0352", + "bytes": 12215, + "modification": null + }, + { + "path": "resource/plant/点地梅/4.png", + "source_sha256": "7d59cd9645dbd22d0b052b5424996930040f5b49e17e97fe3ac92be6c8b3ff8f", + "copied_sha256": "7d59cd9645dbd22d0b052b5424996930040f5b49e17e97fe3ac92be6c8b3ff8f", + "bytes": 26047, + "modification": null + }, + { + "path": "resource/plant/点地梅/5.png", + "source_sha256": "14789ff2158de1f21a8ee65c7cf91d205fa1c355bfde1c36fe298731f4509260", + "copied_sha256": "14789ff2158de1f21a8ee65c7cf91d205fa1c355bfde1c36fe298731f4509260", + "bytes": 27578, + "modification": null + }, + { + "path": "resource/plant/点地梅/icon.png", + "source_sha256": "116c898756079a2aefbaca110046ed6dc9676a9873369d6ed883b5d0aa873e36", + "copied_sha256": "116c898756079a2aefbaca110046ed6dc9676a9873369d6ed883b5d0aa873e36", + "bytes": 14751, + "modification": null + }, + { + "path": "resource/plant/牧草/1.png", + "source_sha256": "183d5a3119c4143cf6f9e6ccdd92deeb5f2ae2266962f9d86670d2952824cc50", + "copied_sha256": "183d5a3119c4143cf6f9e6ccdd92deeb5f2ae2266962f9d86670d2952824cc50", + "bytes": 2132, + "modification": null + }, + { + "path": "resource/plant/牧草/2.png", + "source_sha256": "69ffc0934e2f81b0a17a83e25fa92b11674edf4979656a5f437c0c8613094335", + "copied_sha256": "69ffc0934e2f81b0a17a83e25fa92b11674edf4979656a5f437c0c8613094335", + "bytes": 4615, + "modification": null + }, + { + "path": "resource/plant/牧草/3.png", + "source_sha256": "b7e126d771b7d2f388aa512a49aed59c1b40400389ea2b2776c1ff94ffb2fa1f", + "copied_sha256": "b7e126d771b7d2f388aa512a49aed59c1b40400389ea2b2776c1ff94ffb2fa1f", + "bytes": 17133, + "modification": null + }, + { + "path": "resource/plant/牧草/4.png", + "source_sha256": "d3599f32df48a5bb858b254c0197780683a02b9b383396d946b8d8cfc4d0e564", + "copied_sha256": "d3599f32df48a5bb858b254c0197780683a02b9b383396d946b8d8cfc4d0e564", + "bytes": 14627, + "modification": null + }, + { + "path": "resource/plant/牧草/icon.png", + "source_sha256": "b98f6273c90c62deb6127769920ff95972011c8cd44564da4d2b9402686a843e", + "copied_sha256": "b98f6273c90c62deb6127769920ff95972011c8cd44564da4d2b9402686a843e", + "bytes": 12987, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/1.png", + "source_sha256": "a3e09e2b953b0e88db555745cc3b8d169f0fa7e7187db497bbd35aeada448ce8", + "copied_sha256": "a3e09e2b953b0e88db555745cc3b8d169f0fa7e7187db497bbd35aeada448ce8", + "bytes": 2379, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/2.png", + "source_sha256": "3448034012a68d2a7733f64bf38eb6900e80f8f8cfb87b73ad1bdb576101180a", + "copied_sha256": "3448034012a68d2a7733f64bf38eb6900e80f8f8cfb87b73ad1bdb576101180a", + "bytes": 3374, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/3.png", + "source_sha256": "b59790add2a110f871ed8795336bc0015d9a09ef6024a8146a1de5cd28528688", + "copied_sha256": "b59790add2a110f871ed8795336bc0015d9a09ef6024a8146a1de5cd28528688", + "bytes": 9805, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/4.png", + "source_sha256": "cfb163596ad42ffc3e1e8a564b54c83d26a843fd292bd9d13c14690831b61feb", + "copied_sha256": "cfb163596ad42ffc3e1e8a564b54c83d26a843fd292bd9d13c14690831b61feb", + "bytes": 16345, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/5.png", + "source_sha256": "3164533174d734b107c88b28e5b7137bab5c5f0156fa16bba488ab04894db179", + "copied_sha256": "3164533174d734b107c88b28e5b7137bab5c5f0156fa16bba488ab04894db179", + "bytes": 21276, + "modification": null + }, + { + "path": "resource/plant/猕猴桃/icon.png", + "source_sha256": "0cd8e030ea0c2580bbec2fdaa7fbdb1a130304b4d5450b62bc944db002421249", + "copied_sha256": "0cd8e030ea0c2580bbec2fdaa7fbdb1a130304b4d5450b62bc944db002421249", + "bytes": 13554, + "modification": null + }, + { + "path": "resource/plant/玉米/1.png", + "source_sha256": "ab6d85787babcb2f162c6a33a6ffe3531c617613a2cbe51fb847db2af12e5f72", + "copied_sha256": "ab6d85787babcb2f162c6a33a6ffe3531c617613a2cbe51fb847db2af12e5f72", + "bytes": 3674, + "modification": null + }, + { + "path": "resource/plant/玉米/2.png", + "source_sha256": "e678f97545bb8586918a2f53af95fe74d90fb70a2cc857621c24a8a0a2535b13", + "copied_sha256": "e678f97545bb8586918a2f53af95fe74d90fb70a2cc857621c24a8a0a2535b13", + "bytes": 4657, + "modification": null + }, + { + "path": "resource/plant/玉米/3.png", + "source_sha256": "3569183a08eb75819eada8330820eff378656cab8ee8f30a075e5fed5197a8ff", + "copied_sha256": "3569183a08eb75819eada8330820eff378656cab8ee8f30a075e5fed5197a8ff", + "bytes": 16267, + "modification": null + }, + { + "path": "resource/plant/玉米/4.png", + "source_sha256": "ef83afb461d541d1aa5a0fabcd6e10aaab68d7b15f6cfe0daa02870e1a8d3438", + "copied_sha256": "ef83afb461d541d1aa5a0fabcd6e10aaab68d7b15f6cfe0daa02870e1a8d3438", + "bytes": 20504, + "modification": null + }, + { + "path": "resource/plant/玉米/5.png", + "source_sha256": "06ce289fbcb3caeb3d6f1436ed7bcfd4bdd6f13f7d0054952087d0ed0d27797f", + "copied_sha256": "06ce289fbcb3caeb3d6f1436ed7bcfd4bdd6f13f7d0054952087d0ed0d27797f", + "bytes": 19438, + "modification": null + }, + { + "path": "resource/plant/玉米/icon.png", + "source_sha256": "ab85215c53ebb6494ae37a4b3f64f05091e76aef476282c0c77fab2ba5901ddd", + "copied_sha256": "ab85215c53ebb6494ae37a4b3f64f05091e76aef476282c0c77fab2ba5901ddd", + "bytes": 11693, + "modification": null + }, + { + "path": "resource/plant/甘蔗/1.png", + "source_sha256": "61b2bc787c83c3964f896d799c928fe206042d83de5ce446e297b3b0640f4464", + "copied_sha256": "61b2bc787c83c3964f896d799c928fe206042d83de5ce446e297b3b0640f4464", + "bytes": 2646, + "modification": null + }, + { + "path": "resource/plant/甘蔗/2.png", + "source_sha256": "b1bdd2e4c2b3f2f67c7ff6949e34d6088548235472fed9fd918d4c29a2c8dd25", + "copied_sha256": "b1bdd2e4c2b3f2f67c7ff6949e34d6088548235472fed9fd918d4c29a2c8dd25", + "bytes": 5569, + "modification": null + }, + { + "path": "resource/plant/甘蔗/3.png", + "source_sha256": "15cb2142e0e4f03ed0150cbd385b1827732e93842eaab3164aab187f693a7f9a", + "copied_sha256": "15cb2142e0e4f03ed0150cbd385b1827732e93842eaab3164aab187f693a7f9a", + "bytes": 9356, + "modification": null + }, + { + "path": "resource/plant/甘蔗/4.png", + "source_sha256": "af3010905c65fcff73cbb352b237c8f3fecbe31f78599cb0adfeaa278255b147", + "copied_sha256": "af3010905c65fcff73cbb352b237c8f3fecbe31f78599cb0adfeaa278255b147", + "bytes": 17095, + "modification": null + }, + { + "path": "resource/plant/甘蔗/5.png", + "source_sha256": "fef18ee638899247f25c8dfa5a1b2cdd9d13f2cfb87ee9a107780c9dc031e9fc", + "copied_sha256": "fef18ee638899247f25c8dfa5a1b2cdd9d13f2cfb87ee9a107780c9dc031e9fc", + "bytes": 21575, + "modification": null + }, + { + "path": "resource/plant/甘蔗/icon.png", + "source_sha256": "5166bee733ce7b1371e5cd688526259f8072de3f3f4a65f5fc9c259dd3075169", + "copied_sha256": "5166bee733ce7b1371e5cd688526259f8072de3f3f4a65f5fc9c259dd3075169", + "bytes": 10238, + "modification": null + }, + { + "path": "resource/plant/生菜/1.png", + "source_sha256": "63f58761cc51f774e6037cc1b2941667471ff5b0e2eb52da4f140ff4f078d390", + "copied_sha256": "63f58761cc51f774e6037cc1b2941667471ff5b0e2eb52da4f140ff4f078d390", + "bytes": 899, + "modification": null + }, + { + "path": "resource/plant/生菜/2.png", + "source_sha256": "9e9cdad8809bb05f8cc9673ac89628f3728a1b2361e4f37871a82479a651e969", + "copied_sha256": "9e9cdad8809bb05f8cc9673ac89628f3728a1b2361e4f37871a82479a651e969", + "bytes": 2148, + "modification": null + }, + { + "path": "resource/plant/生菜/3.png", + "source_sha256": "6823949aa588389b388324e74edca069899e0069baf96dedd7871c17a0d401c4", + "copied_sha256": "6823949aa588389b388324e74edca069899e0069baf96dedd7871c17a0d401c4", + "bytes": 4328, + "modification": null + }, + { + "path": "resource/plant/生菜/4.png", + "source_sha256": "c806728b0409a36a2cfe71a2ff933c0c6448d72fc490a3b87b26eeee93f1923d", + "copied_sha256": "c806728b0409a36a2cfe71a2ff933c0c6448d72fc490a3b87b26eeee93f1923d", + "bytes": 9551, + "modification": null + }, + { + "path": "resource/plant/生菜/5.png", + "source_sha256": "6be682cd11eddac79891e62c587fd57655332f38943a4a24f20e3263397f842a", + "copied_sha256": "6be682cd11eddac79891e62c587fd57655332f38943a4a24f20e3263397f842a", + "bytes": 14966, + "modification": null + }, + { + "path": "resource/plant/生菜/icon.png", + "source_sha256": "79b49f2a1ec0310ad5d2f4999ce210a06fbc55c4bdd825b0a944b29137719075", + "copied_sha256": "79b49f2a1ec0310ad5d2f4999ce210a06fbc55c4bdd825b0a944b29137719075", + "bytes": 7203, + "modification": null + }, + { + "path": "resource/plant/番石榴/1.png", + "source_sha256": "e0a46d739ac7f6295f7de980b0450f1f47f8c70b376e470411537db528b37964", + "copied_sha256": "e0a46d739ac7f6295f7de980b0450f1f47f8c70b376e470411537db528b37964", + "bytes": 4721, + "modification": null + }, + { + "path": "resource/plant/番石榴/2.png", + "source_sha256": "ea27004deb2a6ea6ad905bf243cb485b8fb1caaf1b62efa169fbdf58f2b3a6fc", + "copied_sha256": "ea27004deb2a6ea6ad905bf243cb485b8fb1caaf1b62efa169fbdf58f2b3a6fc", + "bytes": 12440, + "modification": null + }, + { + "path": "resource/plant/番石榴/3.png", + "source_sha256": "cc9a431e6595e18b734b23e675263214b1df065fc2ce070dfc0f0cb1fb9732cb", + "copied_sha256": "cc9a431e6595e18b734b23e675263214b1df065fc2ce070dfc0f0cb1fb9732cb", + "bytes": 17227, + "modification": null + }, + { + "path": "resource/plant/番石榴/4.png", + "source_sha256": "a02326c69787d63d4cacb57f462c6fec83a7ea7a2e0904604190e3f24922c910", + "copied_sha256": "a02326c69787d63d4cacb57f462c6fec83a7ea7a2e0904604190e3f24922c910", + "bytes": 20865, + "modification": null + }, + { + "path": "resource/plant/番石榴/5.png", + "source_sha256": "4bb8636be46059f0adb39837a011370d6f1db791bfc3ce653240440ff1686012", + "copied_sha256": "4bb8636be46059f0adb39837a011370d6f1db791bfc3ce653240440ff1686012", + "bytes": 23356, + "modification": null + }, + { + "path": "resource/plant/番石榴/icon.png", + "source_sha256": "3092dbdcba62583f3b54e3f5568a51803815484f3b21770ec6c2b6d254d6a329", + "copied_sha256": "3092dbdcba62583f3b54e3f5568a51803815484f3b21770ec6c2b6d254d6a329", + "bytes": 7277, + "modification": null + }, + { + "path": "resource/plant/番茄/1.png", + "source_sha256": "48de2a54c2868852f70e981a0ef8228ad0bb09499e6c9e84057aaf82f16f7270", + "copied_sha256": "48de2a54c2868852f70e981a0ef8228ad0bb09499e6c9e84057aaf82f16f7270", + "bytes": 4519, + "modification": null + }, + { + "path": "resource/plant/番茄/2.png", + "source_sha256": "d45b3e6896e6eaac51d40fe85ed460b686a8f1d91578a271369f0ea2250f9460", + "copied_sha256": "d45b3e6896e6eaac51d40fe85ed460b686a8f1d91578a271369f0ea2250f9460", + "bytes": 5821, + "modification": null + }, + { + "path": "resource/plant/番茄/3.png", + "source_sha256": "86eb67cc3904bd2cf234cc30c27b01a911f1abdfeec6ccc58f9569a028ad0056", + "copied_sha256": "86eb67cc3904bd2cf234cc30c27b01a911f1abdfeec6ccc58f9569a028ad0056", + "bytes": 16881, + "modification": null + }, + { + "path": "resource/plant/番茄/4.png", + "source_sha256": "14a494d9d0a42315cf09f7c48e7ad11e33a035bda5d0ae4de0b7e42832808c52", + "copied_sha256": "14a494d9d0a42315cf09f7c48e7ad11e33a035bda5d0ae4de0b7e42832808c52", + "bytes": 18666, + "modification": null + }, + { + "path": "resource/plant/番茄/5.png", + "source_sha256": "52a455a943fa41d30db8c2d20861e2d6d465d6f28511933e2b2b3ec994b41a01", + "copied_sha256": "52a455a943fa41d30db8c2d20861e2d6d465d6f28511933e2b2b3ec994b41a01", + "bytes": 18537, + "modification": null + }, + { + "path": "resource/plant/番茄/icon.png", + "source_sha256": "d068d503bc2abdee8037a02981d4511a9c0e3c8f9ebeec13a5ec52c14a4efb61", + "copied_sha256": "d068d503bc2abdee8037a02981d4511a9c0e3c8f9ebeec13a5ec52c14a4efb61", + "bytes": 7309, + "modification": null + }, + { + "path": "resource/plant/番荔枝/1.png", + "source_sha256": "0cbe9593e3491aec31c4ba8190e0d3209c7835b1744c118d054f9a22f7ab36ff", + "copied_sha256": "0cbe9593e3491aec31c4ba8190e0d3209c7835b1744c118d054f9a22f7ab36ff", + "bytes": 6117, + "modification": null + }, + { + "path": "resource/plant/番荔枝/2.png", + "source_sha256": "486bb314164cf86f0112a95ce2ca1f0fb9ab902d306f5df038b742f9274f4a9e", + "copied_sha256": "486bb314164cf86f0112a95ce2ca1f0fb9ab902d306f5df038b742f9274f4a9e", + "bytes": 10468, + "modification": null + }, + { + "path": "resource/plant/番荔枝/3.png", + "source_sha256": "6fece8fd8f5ff7e802d532a9cfdcd5389a491d8c1e4c9236816ae72bc2f50457", + "copied_sha256": "6fece8fd8f5ff7e802d532a9cfdcd5389a491d8c1e4c9236816ae72bc2f50457", + "bytes": 21848, + "modification": null + }, + { + "path": "resource/plant/番荔枝/4.png", + "source_sha256": "e639076ba0d039908193dc2a5d0eee4abe2ee45ebff74eb289588202c8b1a1c4", + "copied_sha256": "e639076ba0d039908193dc2a5d0eee4abe2ee45ebff74eb289588202c8b1a1c4", + "bytes": 28988, + "modification": null + }, + { + "path": "resource/plant/番荔枝/5.png", + "source_sha256": "6b4cc5b8b5ae659f34af621d3a7f096d127dadfc6503148973c1bf35d475d57a", + "copied_sha256": "6b4cc5b8b5ae659f34af621d3a7f096d127dadfc6503148973c1bf35d475d57a", + "bytes": 29612, + "modification": null + }, + { + "path": "resource/plant/番荔枝/icon.png", + "source_sha256": "946051b985a3195521f56e8e4741bb56440d9fb26e9e60323f8be81278353725", + "copied_sha256": "946051b985a3195521f56e8e4741bb56440d9fb26e9e60323f8be81278353725", + "bytes": 13908, + "modification": null + }, + { + "path": "resource/plant/白萝卜/1.png", + "source_sha256": "dc2a69d8438e435b57870246d171a29b91d671b8b7846386e2535db68ab380c0", + "copied_sha256": "dc2a69d8438e435b57870246d171a29b91d671b8b7846386e2535db68ab380c0", + "bytes": 2563, + "modification": null + }, + { + "path": "resource/plant/白萝卜/2.png", + "source_sha256": "79211fce07648b11a54e7c6b13e106c02accca504a4be3386371ec18d5c779c3", + "copied_sha256": "79211fce07648b11a54e7c6b13e106c02accca504a4be3386371ec18d5c779c3", + "bytes": 3345, + "modification": null + }, + { + "path": "resource/plant/白萝卜/3.png", + "source_sha256": "4b77bb0f3db7fff21f873881de6c76df9bfc809f92f2fc521745c32550d720cc", + "copied_sha256": "4b77bb0f3db7fff21f873881de6c76df9bfc809f92f2fc521745c32550d720cc", + "bytes": 8500, + "modification": null + }, + { + "path": "resource/plant/白萝卜/4.png", + "source_sha256": "8e06fcb06a8081060dfbb8b6ac2db42a2a3cee14fab4ae57e083f907abc95632", + "copied_sha256": "8e06fcb06a8081060dfbb8b6ac2db42a2a3cee14fab4ae57e083f907abc95632", + "bytes": 28359, + "modification": null + }, + { + "path": "resource/plant/白萝卜/icon.png", + "source_sha256": "ecb0e8d11a620b03f2fb990f1dab5b0ffa051eba136b7bf2c0119e6ec8d9f841", + "copied_sha256": "ecb0e8d11a620b03f2fb990f1dab5b0ffa051eba136b7bf2c0119e6ec8d9f841", + "bytes": 9310, + "modification": null + }, + { + "path": "resource/plant/百香果/1.png", + "source_sha256": "0627e9f68daad4fb9dc83f930160e06e750f7c65e419b3cc8b7071108a8c0d70", + "copied_sha256": "0627e9f68daad4fb9dc83f930160e06e750f7c65e419b3cc8b7071108a8c0d70", + "bytes": 2282, + "modification": null + }, + { + "path": "resource/plant/百香果/2.png", + "source_sha256": "948bf55e5f667cd487237882a4eeddcfc57fbbe0d79f47b421debae0022bac7c", + "copied_sha256": "948bf55e5f667cd487237882a4eeddcfc57fbbe0d79f47b421debae0022bac7c", + "bytes": 5178, + "modification": null + }, + { + "path": "resource/plant/百香果/3.png", + "source_sha256": "c90f65069cd71ac64392dd0c990ddf7954e81d97d127d38e4911c7d4aa142267", + "copied_sha256": "c90f65069cd71ac64392dd0c990ddf7954e81d97d127d38e4911c7d4aa142267", + "bytes": 21907, + "modification": null + }, + { + "path": "resource/plant/百香果/4.png", + "source_sha256": "aeb0b24e74f80c9b842241613fe9c3303284565b56939415f93147a6b006139b", + "copied_sha256": "aeb0b24e74f80c9b842241613fe9c3303284565b56939415f93147a6b006139b", + "bytes": 23817, + "modification": null + }, + { + "path": "resource/plant/百香果/5.png", + "source_sha256": "a3f852c8ce2dc018411dfcdc651cc6a2adc632b103f82d49801a99b84b54592d", + "copied_sha256": "a3f852c8ce2dc018411dfcdc651cc6a2adc632b103f82d49801a99b84b54592d", + "bytes": 23841, + "modification": null + }, + { + "path": "resource/plant/百香果/icon.png", + "source_sha256": "5eef021c067edf9610c4312362f25017b25c885553556e8fa0c86a2b89048b41", + "copied_sha256": "5eef021c067edf9610c4312362f25017b25c885553556e8fa0c86a2b89048b41", + "bytes": 8229, + "modification": null + }, + { + "path": "resource/plant/益母草/1.png", + "source_sha256": "9abf7208deb4fa48761c15ed825bc3a15c1afd751a1f6cf6a23d7b5b42a07809", + "copied_sha256": "9abf7208deb4fa48761c15ed825bc3a15c1afd751a1f6cf6a23d7b5b42a07809", + "bytes": 839, + "modification": null + }, + { + "path": "resource/plant/益母草/2.png", + "source_sha256": "c542b2fd5605aa32e39e14535f974154fcfe2c8417f6376d0f481b6cac4615a0", + "copied_sha256": "c542b2fd5605aa32e39e14535f974154fcfe2c8417f6376d0f481b6cac4615a0", + "bytes": 2087, + "modification": null + }, + { + "path": "resource/plant/益母草/3.png", + "source_sha256": "f09e31995ae863cda34334377066803145ad0c01abb725cafd5ca5ac18605821", + "copied_sha256": "f09e31995ae863cda34334377066803145ad0c01abb725cafd5ca5ac18605821", + "bytes": 5866, + "modification": null + }, + { + "path": "resource/plant/益母草/4.png", + "source_sha256": "3a6f6bc009ad50466781f8a4386316c575f782ad50b8fbb7a9ec2285eeba80c6", + "copied_sha256": "3a6f6bc009ad50466781f8a4386316c575f782ad50b8fbb7a9ec2285eeba80c6", + "bytes": 9822, + "modification": null + }, + { + "path": "resource/plant/益母草/5.png", + "source_sha256": "a08322b57a767d6b30f86824068da4c2ee10325c0fb85274dcac62dd34ee37f4", + "copied_sha256": "a08322b57a767d6b30f86824068da4c2ee10325c0fb85274dcac62dd34ee37f4", + "bytes": 15399, + "modification": null + }, + { + "path": "resource/plant/益母草/icon.png", + "source_sha256": "c7abe3edd448eb4af61edc53d25818f42c7ca35e5bb7f3bd5826216fb0f03a0b", + "copied_sha256": "c7abe3edd448eb4af61edc53d25818f42c7ca35e5bb7f3bd5826216fb0f03a0b", + "bytes": 12066, + "modification": null + }, + { + "path": "resource/plant/睡莲/1.png", + "source_sha256": "345a197c7bd05671ee3183da48023b4d156ca798e8960d71c7db755f1c0575c5", + "copied_sha256": "345a197c7bd05671ee3183da48023b4d156ca798e8960d71c7db755f1c0575c5", + "bytes": 11353, + "modification": null + }, + { + "path": "resource/plant/睡莲/2.png", + "source_sha256": "1fabe9809448a903c3b744e9f39b8e21eb0512a544fb7e8f461622fb412db34b", + "copied_sha256": "1fabe9809448a903c3b744e9f39b8e21eb0512a544fb7e8f461622fb412db34b", + "bytes": 13769, + "modification": null + }, + { + "path": "resource/plant/睡莲/3.png", + "source_sha256": "e7d0692948e210901e91109a371c07c2ccad94e3469d7a416b96bbdb66f37a2a", + "copied_sha256": "e7d0692948e210901e91109a371c07c2ccad94e3469d7a416b96bbdb66f37a2a", + "bytes": 15264, + "modification": null + }, + { + "path": "resource/plant/睡莲/4.png", + "source_sha256": "914fe1078d65c61ea6cc9f877f9ca2056277ffa2d8e043a09681c2309718ff96", + "copied_sha256": "914fe1078d65c61ea6cc9f877f9ca2056277ffa2d8e043a09681c2309718ff96", + "bytes": 16829, + "modification": null + }, + { + "path": "resource/plant/睡莲/5.png", + "source_sha256": "3f2cf80bac71a4302640a569d9ef8acf88f80ad5374548a965aebf96439ee190", + "copied_sha256": "3f2cf80bac71a4302640a569d9ef8acf88f80ad5374548a965aebf96439ee190", + "bytes": 21057, + "modification": null + }, + { + "path": "resource/plant/睡莲/icon.png", + "source_sha256": "62bef47fa520c15eeaa8e48da03a669712a7f239f6257c2145d0280069a25884", + "copied_sha256": "62bef47fa520c15eeaa8e48da03a669712a7f239f6257c2145d0280069a25884", + "bytes": 19150, + "modification": null + }, + { + "path": "resource/plant/石榴/1.png", + "source_sha256": "09544e01b3b9a13dcf538fa55beb8120c0c4a3393a08c1a4ce23abdd21c99dd7", + "copied_sha256": "09544e01b3b9a13dcf538fa55beb8120c0c4a3393a08c1a4ce23abdd21c99dd7", + "bytes": 2536, + "modification": null + }, + { + "path": "resource/plant/石榴/2.png", + "source_sha256": "8888f07cde4e9b52eadbff4080440755c00724b82f2daec87d567e08c87e0f9d", + "copied_sha256": "8888f07cde4e9b52eadbff4080440755c00724b82f2daec87d567e08c87e0f9d", + "bytes": 8312, + "modification": null + }, + { + "path": "resource/plant/石榴/3.png", + "source_sha256": "fef0b220cf10bb2ee23aabd0d5c68c49302addbbb9e8466336e2010dcef9c661", + "copied_sha256": "fef0b220cf10bb2ee23aabd0d5c68c49302addbbb9e8466336e2010dcef9c661", + "bytes": 15173, + "modification": null + }, + { + "path": "resource/plant/石榴/4.png", + "source_sha256": "ae5e7adf557381f3b0f7ac4e09f47589ad97ce3a20fe0059d6a364bfa26e945f", + "copied_sha256": "ae5e7adf557381f3b0f7ac4e09f47589ad97ce3a20fe0059d6a364bfa26e945f", + "bytes": 19201, + "modification": null + }, + { + "path": "resource/plant/石榴/5.png", + "source_sha256": "6f5f68d91db058b781fc455b727ea935d982275d4bbfd0ce5fdb3006ace79d74", + "copied_sha256": "6f5f68d91db058b781fc455b727ea935d982275d4bbfd0ce5fdb3006ace79d74", + "bytes": 18787, + "modification": null + }, + { + "path": "resource/plant/石榴/icon.png", + "source_sha256": "8b92d40654dadd72af99fa828d9cc426485e03e2c81bf72ce10bcf96e58f2a5b", + "copied_sha256": "8b92d40654dadd72af99fa828d9cc426485e03e2c81bf72ce10bcf96e58f2a5b", + "bytes": 7916, + "modification": null + }, + { + "path": "resource/plant/竹笋/1.png", + "source_sha256": "1b683b134b5c5e851c6618e3869c3d116cab05a4cfa9d91d5be3ed4cae425f06", + "copied_sha256": "1b683b134b5c5e851c6618e3869c3d116cab05a4cfa9d91d5be3ed4cae425f06", + "bytes": 2625, + "modification": null + }, + { + "path": "resource/plant/竹笋/2.png", + "source_sha256": "60543d08f856292fcc3248b6321b96561be4dce8e4c96a23d9f6d90663283c40", + "copied_sha256": "60543d08f856292fcc3248b6321b96561be4dce8e4c96a23d9f6d90663283c40", + "bytes": 4875, + "modification": null + }, + { + "path": "resource/plant/竹笋/3.png", + "source_sha256": "f8a17520b406b26d97caec5ab503311ebc95e9482dbceb8d154fa6c138e184b6", + "copied_sha256": "f8a17520b406b26d97caec5ab503311ebc95e9482dbceb8d154fa6c138e184b6", + "bytes": 8960, + "modification": null + }, + { + "path": "resource/plant/竹笋/4.png", + "source_sha256": "c7b62bd66d6ec765983d07b66d754a7163083b9c4494884b6a7fe327b536bb62", + "copied_sha256": "c7b62bd66d6ec765983d07b66d754a7163083b9c4494884b6a7fe327b536bb62", + "bytes": 15149, + "modification": null + }, + { + "path": "resource/plant/竹笋/5.png", + "source_sha256": "51665020450fcc59d3f00fd68f7d1483fac10d45f2d2854e7a17a3ccff269b36", + "copied_sha256": "51665020450fcc59d3f00fd68f7d1483fac10d45f2d2854e7a17a3ccff269b36", + "bytes": 18794, + "modification": null + }, + { + "path": "resource/plant/竹笋/icon.png", + "source_sha256": "0869c695e8c4bdf0a4003069fa16c93329075a654fe0f56e2895c45ddb25a17a", + "copied_sha256": "0869c695e8c4bdf0a4003069fa16c93329075a654fe0f56e2895c45ddb25a17a", + "bytes": 10599, + "modification": null + }, + { + "path": "resource/plant/箬竹/1.png", + "source_sha256": "b3413b8dcc810d21316b99c994c2cff60a74200c4fa65693418ba95ba0be027f", + "copied_sha256": "b3413b8dcc810d21316b99c994c2cff60a74200c4fa65693418ba95ba0be027f", + "bytes": 4404, + "modification": null + }, + { + "path": "resource/plant/箬竹/2.png", + "source_sha256": "17eba0656d5c48f6819f34676b89d7b9f683a3a34ac502ac7eae468be464bf50", + "copied_sha256": "17eba0656d5c48f6819f34676b89d7b9f683a3a34ac502ac7eae468be464bf50", + "bytes": 8318, + "modification": null + }, + { + "path": "resource/plant/箬竹/3.png", + "source_sha256": "2f62b3036cc4cfc3ffe507932940ece597094b5d572e686d2507be47a563300f", + "copied_sha256": "2f62b3036cc4cfc3ffe507932940ece597094b5d572e686d2507be47a563300f", + "bytes": 11621, + "modification": null + }, + { + "path": "resource/plant/箬竹/4.png", + "source_sha256": "3c81704c43db543e2bce11ca41b2ded23951ab7f81df1ec7e9243c17f682a6e1", + "copied_sha256": "3c81704c43db543e2bce11ca41b2ded23951ab7f81df1ec7e9243c17f682a6e1", + "bytes": 16102, + "modification": null + }, + { + "path": "resource/plant/箬竹/5.png", + "source_sha256": "4e208e53d927ba13b8a70eb79ad3d3485444e098a8cd62959dc4633fd01394fe", + "copied_sha256": "4e208e53d927ba13b8a70eb79ad3d3485444e098a8cd62959dc4633fd01394fe", + "bytes": 22968, + "modification": null + }, + { + "path": "resource/plant/箬竹/icon.png", + "source_sha256": "3c2f04f7c6369210928e82821d86e071714d3eb46a21f41cbec80e06b619ae59", + "copied_sha256": "3c2f04f7c6369210928e82821d86e071714d3eb46a21f41cbec80e06b619ae59", + "bytes": 11556, + "modification": null + }, + { + "path": "resource/plant/红叶梅/1.png", + "source_sha256": "980ad331b234d9d65a2d1bb7086251daf9847f1f161b0a66b422e09765725deb", + "copied_sha256": "980ad331b234d9d65a2d1bb7086251daf9847f1f161b0a66b422e09765725deb", + "bytes": 966, + "modification": null + }, + { + "path": "resource/plant/红叶梅/2.png", + "source_sha256": "541b45ecb3c3f719e1a413ccabeb645ab72749ea692a3981cf901dbb93cafdf0", + "copied_sha256": "541b45ecb3c3f719e1a413ccabeb645ab72749ea692a3981cf901dbb93cafdf0", + "bytes": 4610, + "modification": null + }, + { + "path": "resource/plant/红叶梅/3.png", + "source_sha256": "1a443bec6a1aea5fbf58a9e3f0acfe6eba4343fd7143d3e165fe8ac97d5de1a7", + "copied_sha256": "1a443bec6a1aea5fbf58a9e3f0acfe6eba4343fd7143d3e165fe8ac97d5de1a7", + "bytes": 8407, + "modification": null + }, + { + "path": "resource/plant/红叶梅/4.png", + "source_sha256": "18336cebd29ecc8ef78b04b76d73841bd3f06c071aa088a61f907ceee7a34325", + "copied_sha256": "18336cebd29ecc8ef78b04b76d73841bd3f06c071aa088a61f907ceee7a34325", + "bytes": 21356, + "modification": null + }, + { + "path": "resource/plant/红叶梅/5.png", + "source_sha256": "366dcf64921244226cbd7045de0d8502202272fdb4636df9e7b23596eff21cb2", + "copied_sha256": "366dcf64921244226cbd7045de0d8502202272fdb4636df9e7b23596eff21cb2", + "bytes": 29663, + "modification": null + }, + { + "path": "resource/plant/红叶梅/icon.png", + "source_sha256": "a068b39b571c99ad2c6b43d62388ac21a1139e1cfe6bffac5dec5414bb0f3148", + "copied_sha256": "a068b39b571c99ad2c6b43d62388ac21a1139e1cfe6bffac5dec5414bb0f3148", + "bytes": 15125, + "modification": null + }, + { + "path": "resource/plant/红枣/1.png", + "source_sha256": "f94f0c732f1f31e35514fd74ff06d188d432ced16e080ae1e6b3a206bdedb600", + "copied_sha256": "f94f0c732f1f31e35514fd74ff06d188d432ced16e080ae1e6b3a206bdedb600", + "bytes": 2588, + "modification": null + }, + { + "path": "resource/plant/红枣/2.png", + "source_sha256": "efe3074e67477714887ac8a5f6fc5b931dba585e11027ca91ebc1b48d020ab24", + "copied_sha256": "efe3074e67477714887ac8a5f6fc5b931dba585e11027ca91ebc1b48d020ab24", + "bytes": 6412, + "modification": null + }, + { + "path": "resource/plant/红枣/3.png", + "source_sha256": "fff959106d712a607c50e25def7891a54a1dd0b49ad3cc9e0c476bf8c398a3b1", + "copied_sha256": "fff959106d712a607c50e25def7891a54a1dd0b49ad3cc9e0c476bf8c398a3b1", + "bytes": 20962, + "modification": null + }, + { + "path": "resource/plant/红枣/4.png", + "source_sha256": "355b3b3ed414b21c540351b2179401da2983028bcc413eede019b8d8951a21bf", + "copied_sha256": "355b3b3ed414b21c540351b2179401da2983028bcc413eede019b8d8951a21bf", + "bytes": 25435, + "modification": null + }, + { + "path": "resource/plant/红枣/5.png", + "source_sha256": "8070f2acddee0670f8eb89442b44f9a7ac0cb46d2507a7bcc94dc02981ea4028", + "copied_sha256": "8070f2acddee0670f8eb89442b44f9a7ac0cb46d2507a7bcc94dc02981ea4028", + "bytes": 27945, + "modification": null + }, + { + "path": "resource/plant/红枣/icon.png", + "source_sha256": "736a6d84f1fa93da922ef90fb578d42d27b7507b07b407434b0a0f75649fc3c4", + "copied_sha256": "736a6d84f1fa93da922ef90fb578d42d27b7507b07b407434b0a0f75649fc3c4", + "bytes": 9198, + "modification": null + }, + { + "path": "resource/plant/红毛丹/1.png", + "source_sha256": "683062c1571ebdcd49dcdd3ca964d32dd06cab2ca4af1e5c62871d6ee2420ad7", + "copied_sha256": "683062c1571ebdcd49dcdd3ca964d32dd06cab2ca4af1e5c62871d6ee2420ad7", + "bytes": 2150, + "modification": null + }, + { + "path": "resource/plant/红毛丹/2.png", + "source_sha256": "c74b738942b34582d81acfb4aaa4cef1981ea3439e8c893cdaa77aab138e319d", + "copied_sha256": "c74b738942b34582d81acfb4aaa4cef1981ea3439e8c893cdaa77aab138e319d", + "bytes": 14503, + "modification": null + }, + { + "path": "resource/plant/红毛丹/3.png", + "source_sha256": "a6896447e26ad0c29a880c9421fda654130e7cd78e73e21416a0107d863d1b04", + "copied_sha256": "a6896447e26ad0c29a880c9421fda654130e7cd78e73e21416a0107d863d1b04", + "bytes": 20913, + "modification": null + }, + { + "path": "resource/plant/红毛丹/4.png", + "source_sha256": "304c9c4357c71adcb12aebb9d2a391d741b7cf948ba64c19b8e60606589e0f04", + "copied_sha256": "304c9c4357c71adcb12aebb9d2a391d741b7cf948ba64c19b8e60606589e0f04", + "bytes": 25661, + "modification": null + }, + { + "path": "resource/plant/红毛丹/5.png", + "source_sha256": "199fb4e700c3d5f006988842e667d15e01e93d608603b60b80a0a1157e555b80", + "copied_sha256": "199fb4e700c3d5f006988842e667d15e01e93d608603b60b80a0a1157e555b80", + "bytes": 29297, + "modification": null + }, + { + "path": "resource/plant/红毛丹/icon.png", + "source_sha256": "3ad66e423f4951f8015a2cc9c34e8a8432e0d7aee65ce3f5c831180e86bef138", + "copied_sha256": "3ad66e423f4951f8015a2cc9c34e8a8432e0d7aee65ce3f5c831180e86bef138", + "bytes": 17751, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/1.png", + "source_sha256": "7277bfb069ef402cb85f021436a748289abdabc0076193b090bdefad1e7e8285", + "copied_sha256": "7277bfb069ef402cb85f021436a748289abdabc0076193b090bdefad1e7e8285", + "bytes": 2625, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/2.png", + "source_sha256": "8d56e23c265555a755af863578d003895b2c5534c83384ba9b36cb9ff95b4ee2", + "copied_sha256": "8d56e23c265555a755af863578d003895b2c5534c83384ba9b36cb9ff95b4ee2", + "bytes": 5739, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/3.png", + "source_sha256": "479ce727328db8b8aa772829a7c7ec81d43aff8ed0ca00b740566cbab9283883", + "copied_sha256": "479ce727328db8b8aa772829a7c7ec81d43aff8ed0ca00b740566cbab9283883", + "bytes": 15289, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/4.png", + "source_sha256": "0b8e03a472d380b7429fb62b58903b6bc4df47cb8e20190b64835711e59c2fbc", + "copied_sha256": "0b8e03a472d380b7429fb62b58903b6bc4df47cb8e20190b64835711e59c2fbc", + "bytes": 17406, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/5.png", + "source_sha256": "0229e194e44ad2de8c2e57e8ab19fb333e2fbddd90852374b378178f3759195e", + "copied_sha256": "0229e194e44ad2de8c2e57e8ab19fb333e2fbddd90852374b378178f3759195e", + "bytes": 19752, + "modification": null + }, + { + "path": "resource/plant/红玫瑰/icon.png", + "source_sha256": "5a1e4f71db8f8c432cc6e3078db0c3dbb083fd0590a64e72f6d8ca5dc5053f84", + "copied_sha256": "5a1e4f71db8f8c432cc6e3078db0c3dbb083fd0590a64e72f6d8ca5dc5053f84", + "bytes": 11514, + "modification": null + }, + { + "path": "resource/plant/胡萝卜/1.png", + "source_sha256": "2bc84cb733bf8c1615d16c06c97b1ae75df7cab671a0163d289fc3abde0d6a85", + "copied_sha256": "2bc84cb733bf8c1615d16c06c97b1ae75df7cab671a0163d289fc3abde0d6a85", + "bytes": 2556, + "modification": null + }, + { + "path": "resource/plant/胡萝卜/2.png", + "source_sha256": "d5413f0bcdae26d067fd4e1e227a03e823089c3fa4e81a9a6c24a818c52c812d", + "copied_sha256": "d5413f0bcdae26d067fd4e1e227a03e823089c3fa4e81a9a6c24a818c52c812d", + "bytes": 3365, + "modification": null + }, + { + "path": "resource/plant/胡萝卜/3.png", + "source_sha256": "811422d67fb641c5df55ba30d0592329f58cfa8ac5ec2ce90eee4cd7c9cc460c", + "copied_sha256": "811422d67fb641c5df55ba30d0592329f58cfa8ac5ec2ce90eee4cd7c9cc460c", + "bytes": 8513, + "modification": null + }, + { + "path": "resource/plant/胡萝卜/4.png", + "source_sha256": "10761093cbaec3b308b688b4100a2ceb0ac91119b29cf08b37cb56a60c73b11a", + "copied_sha256": "10761093cbaec3b308b688b4100a2ceb0ac91119b29cf08b37cb56a60c73b11a", + "bytes": 17917, + "modification": null + }, + { + "path": "resource/plant/胡萝卜/icon.png", + "source_sha256": "d1d1da2511f99fa843b671a187ca2d488ab2b6e925db3d13e0ceb6d5a88721b4", + "copied_sha256": "d1d1da2511f99fa843b671a187ca2d488ab2b6e925db3d13e0ceb6d5a88721b4", + "bytes": 4965, + "modification": null + }, + { + "path": "resource/plant/芒果/1.png", + "source_sha256": "f50cd34122a6fe5111d78e796889b4278edd5eac3bc9ae7a82df82628001e237", + "copied_sha256": "f50cd34122a6fe5111d78e796889b4278edd5eac3bc9ae7a82df82628001e237", + "bytes": 2150, + "modification": null + }, + { + "path": "resource/plant/芒果/2.png", + "source_sha256": "365382d50026838bf45e2e47c641ce56739e91f5d34acb1a3ba0f680f2a77549", + "copied_sha256": "365382d50026838bf45e2e47c641ce56739e91f5d34acb1a3ba0f680f2a77549", + "bytes": 5651, + "modification": null + }, + { + "path": "resource/plant/芒果/3.png", + "source_sha256": "971bc9a0191d746c76c1f43248c95ddef723433a8c8aa444b88ae9918d6a82a5", + "copied_sha256": "971bc9a0191d746c76c1f43248c95ddef723433a8c8aa444b88ae9918d6a82a5", + "bytes": 18025, + "modification": null + }, + { + "path": "resource/plant/芒果/4.png", + "source_sha256": "896029f0f33861d0da6df61b489e44cb01b0c1fdbb7318a5caf2421cf1649fdc", + "copied_sha256": "896029f0f33861d0da6df61b489e44cb01b0c1fdbb7318a5caf2421cf1649fdc", + "bytes": 26632, + "modification": null + }, + { + "path": "resource/plant/芒果/5.png", + "source_sha256": "f2f218e287d15dfc2b9f89bf688ced2435db5421655b3828089ffbce1dbdd777", + "copied_sha256": "f2f218e287d15dfc2b9f89bf688ced2435db5421655b3828089ffbce1dbdd777", + "bytes": 22706, + "modification": null + }, + { + "path": "resource/plant/芒果/icon.png", + "source_sha256": "98146d3d643dec342ba0f19bb455d600eaba1e3cc7abd4d7bd150adec95a0bdd", + "copied_sha256": "98146d3d643dec342ba0f19bb455d600eaba1e3cc7abd4d7bd150adec95a0bdd", + "bytes": 13441, + "modification": null + }, + { + "path": "resource/plant/芦荟/0.png", + "source_sha256": "555992a140d13779320cf1b529f0e579c0c9095ab8b6caddc442111bdb3ca8bb", + "copied_sha256": "555992a140d13779320cf1b529f0e579c0c9095ab8b6caddc442111bdb3ca8bb", + "bytes": 580, + "modification": null + }, + { + "path": "resource/plant/芦荟/1.png", + "source_sha256": "3750257fc18884b444f0e7460ac564a816c5f665be999ce819a30f5a0d453467", + "copied_sha256": "3750257fc18884b444f0e7460ac564a816c5f665be999ce819a30f5a0d453467", + "bytes": 1213, + "modification": null + }, + { + "path": "resource/plant/芦荟/2.png", + "source_sha256": "b340b3dc41ca6bc63eacc269eac3c4dc6f4264be4c47c074460ba82945edf0a0", + "copied_sha256": "b340b3dc41ca6bc63eacc269eac3c4dc6f4264be4c47c074460ba82945edf0a0", + "bytes": 2264, + "modification": null + }, + { + "path": "resource/plant/芦荟/3.png", + "source_sha256": "f019d7ceaa9ecb538acab0c56d921ef025941ddd26ce11ca1c7751d373d0e424", + "copied_sha256": "f019d7ceaa9ecb538acab0c56d921ef025941ddd26ce11ca1c7751d373d0e424", + "bytes": 4203, + "modification": null + }, + { + "path": "resource/plant/芦荟/4.png", + "source_sha256": "aab02531bc23d2942c498ebee86ae53a7e64465387e3a426b207ca43150c1b23", + "copied_sha256": "aab02531bc23d2942c498ebee86ae53a7e64465387e3a426b207ca43150c1b23", + "bytes": 10069, + "modification": null + }, + { + "path": "resource/plant/芦荟/5.png", + "source_sha256": "c58838bfb72c482045c9f884bca7439e9a700866484aa281404165281384ba7f", + "copied_sha256": "c58838bfb72c482045c9f884bca7439e9a700866484aa281404165281384ba7f", + "bytes": 8623, + "modification": null + }, + { + "path": "resource/plant/芦荟/icon.png", + "source_sha256": "430907d07e2bb080177537d79957f3cc1350e3f6ac09d578e5aeeac013386a4b", + "copied_sha256": "430907d07e2bb080177537d79957f3cc1350e3f6ac09d578e5aeeac013386a4b", + "bytes": 10078, + "modification": null + }, + { + "path": "resource/plant/芭蕉/1.png", + "source_sha256": "06611ad6d2961b4e0c8d8993f6fe873159605ef90a7a698eeddefa352e31a4b2", + "copied_sha256": "06611ad6d2961b4e0c8d8993f6fe873159605ef90a7a698eeddefa352e31a4b2", + "bytes": 2659, + "modification": null + }, + { + "path": "resource/plant/芭蕉/2.png", + "source_sha256": "c6b9529d1f3561272b51ff54a07e31c501672e447f56e23f9566558ed12c248a", + "copied_sha256": "c6b9529d1f3561272b51ff54a07e31c501672e447f56e23f9566558ed12c248a", + "bytes": 6209, + "modification": null + }, + { + "path": "resource/plant/芭蕉/3.png", + "source_sha256": "e4a76d4524a8fab10425ae3c19809748aa385407ed9acc69ae7f2ce167213a8d", + "copied_sha256": "e4a76d4524a8fab10425ae3c19809748aa385407ed9acc69ae7f2ce167213a8d", + "bytes": 16380, + "modification": null + }, + { + "path": "resource/plant/芭蕉/4.png", + "source_sha256": "27bfb6304efbf52a26cb148f10fb2d3484feac993b64c877de7d5ffd36fa22ea", + "copied_sha256": "27bfb6304efbf52a26cb148f10fb2d3484feac993b64c877de7d5ffd36fa22ea", + "bytes": 19655, + "modification": null + }, + { + "path": "resource/plant/芭蕉/5.png", + "source_sha256": "3bee0f94dc687fe3850ab4bdfdd1673777dc25248b500f20d847599913b9145f", + "copied_sha256": "3bee0f94dc687fe3850ab4bdfdd1673777dc25248b500f20d847599913b9145f", + "bytes": 24778, + "modification": null + }, + { + "path": "resource/plant/芭蕉/icon.png", + "source_sha256": "b98968c8b9ed9530885b8b5b9f88b37ed3cd50c8d4d5ba80c5a79d1a470e6520", + "copied_sha256": "b98968c8b9ed9530885b8b5b9f88b37ed3cd50c8d4d5ba80c5a79d1a470e6520", + "bytes": 6769, + "modification": null + }, + { + "path": "resource/plant/花生/1.png", + "source_sha256": "3396431e856ed6079f04f17678192767ced92c7bd3da74756c4a8e611ac7f8d7", + "copied_sha256": "3396431e856ed6079f04f17678192767ced92c7bd3da74756c4a8e611ac7f8d7", + "bytes": 2950, + "modification": null + }, + { + "path": "resource/plant/花生/2.png", + "source_sha256": "924933797db6d9c2a8383284290d1c9cb380678ee12628b6cc85802a51b39ab6", + "copied_sha256": "924933797db6d9c2a8383284290d1c9cb380678ee12628b6cc85802a51b39ab6", + "bytes": 6433, + "modification": null + }, + { + "path": "resource/plant/花生/3.png", + "source_sha256": "e881d148a62c79e69e64bfcd1fb435fe4b6d5c2848c1facf19923f3ab2a15c8b", + "copied_sha256": "e881d148a62c79e69e64bfcd1fb435fe4b6d5c2848c1facf19923f3ab2a15c8b", + "bytes": 14004, + "modification": null + }, + { + "path": "resource/plant/花生/4.png", + "source_sha256": "e443fd84beb6acb528e8112d40dfd907ed407ddc03b1d05ddddb7c440d964d09", + "copied_sha256": "e443fd84beb6acb528e8112d40dfd907ed407ddc03b1d05ddddb7c440d964d09", + "bytes": 14436, + "modification": null + }, + { + "path": "resource/plant/花生/5.png", + "source_sha256": "7a8eccc6b558d2f8bfe9ca1e6e3585b262920f40ab8a4e2f07c9f6d622d96f64", + "copied_sha256": "7a8eccc6b558d2f8bfe9ca1e6e3585b262920f40ab8a4e2f07c9f6d622d96f64", + "bytes": 21779, + "modification": null + }, + { + "path": "resource/plant/花生/icon.png", + "source_sha256": "209782db4277b5fe74649b5903793ead7b7d15dd16a7ac1fe5c34e6916b3d2dc", + "copied_sha256": "209782db4277b5fe74649b5903793ead7b7d15dd16a7ac1fe5c34e6916b3d2dc", + "bytes": 15814, + "modification": null + }, + { + "path": "resource/plant/花菜/1.png", + "source_sha256": "8af560b67bf18511011519606bfe7cf43fc25a6716edc9a7cdf6d8d4b44b4d29", + "copied_sha256": "8af560b67bf18511011519606bfe7cf43fc25a6716edc9a7cdf6d8d4b44b4d29", + "bytes": 1032, + "modification": null + }, + { + "path": "resource/plant/花菜/2.png", + "source_sha256": "e910d20bbdd50bdd80383cb0a7d2fdaa6346d52373bce8eca5253d46696a891f", + "copied_sha256": "e910d20bbdd50bdd80383cb0a7d2fdaa6346d52373bce8eca5253d46696a891f", + "bytes": 3481, + "modification": null + }, + { + "path": "resource/plant/花菜/3.png", + "source_sha256": "2a6815eb90a55253d2729a8313d01d511f71969a6271d6ca55974cb2e3cf4088", + "copied_sha256": "2a6815eb90a55253d2729a8313d01d511f71969a6271d6ca55974cb2e3cf4088", + "bytes": 8495, + "modification": null + }, + { + "path": "resource/plant/花菜/4.png", + "source_sha256": "0789f207a19a6144b1b32e60bb2d33c4901792d27c1a7d81137a3349d61e1fc2", + "copied_sha256": "0789f207a19a6144b1b32e60bb2d33c4901792d27c1a7d81137a3349d61e1fc2", + "bytes": 13302, + "modification": null + }, + { + "path": "resource/plant/花菜/5.png", + "source_sha256": "1bcf80be3aeca323142277b7a3a3cc4600384e9c508d75dcd7609767ff927ea8", + "copied_sha256": "1bcf80be3aeca323142277b7a3a3cc4600384e9c508d75dcd7609767ff927ea8", + "bytes": 16752, + "modification": null + }, + { + "path": "resource/plant/花菜/icon.png", + "source_sha256": "14f09974b3bd97262df037409ce645bdf4cf1d952393729a3c31474b4c817709", + "copied_sha256": "14f09974b3bd97262df037409ce645bdf4cf1d952393729a3c31474b4c817709", + "bytes": 8331, + "modification": null + }, + { + "path": "resource/plant/芹菜/1.png", + "source_sha256": "ce89731b1acb336204f5e6be67f1bd83ddb19fbe7b11c0b9f10a53c2f42ae1c4", + "copied_sha256": "ce89731b1acb336204f5e6be67f1bd83ddb19fbe7b11c0b9f10a53c2f42ae1c4", + "bytes": 744, + "modification": null + }, + { + "path": "resource/plant/芹菜/2.png", + "source_sha256": "9349654ca5a194ba634c2642561c58ef13713960062591ee0e1ff0f0d862a1c5", + "copied_sha256": "9349654ca5a194ba634c2642561c58ef13713960062591ee0e1ff0f0d862a1c5", + "bytes": 1414, + "modification": null + }, + { + "path": "resource/plant/芹菜/3.png", + "source_sha256": "7613edaddce8c9ecd23fec87ff755cc87b7aa7f02d3f1920348089851009b521", + "copied_sha256": "7613edaddce8c9ecd23fec87ff755cc87b7aa7f02d3f1920348089851009b521", + "bytes": 3787, + "modification": null + }, + { + "path": "resource/plant/芹菜/4.png", + "source_sha256": "a36164433a010e3df32bff1b80465a18be4671b94cfb4349ad33d09518e37caf", + "copied_sha256": "a36164433a010e3df32bff1b80465a18be4671b94cfb4349ad33d09518e37caf", + "bytes": 10574, + "modification": null + }, + { + "path": "resource/plant/芹菜/5.png", + "source_sha256": "22eb46300650bab577002e22765e026d8e819dbcc5639d726f3c7459ffaa039e", + "copied_sha256": "22eb46300650bab577002e22765e026d8e819dbcc5639d726f3c7459ffaa039e", + "bytes": 23024, + "modification": null + }, + { + "path": "resource/plant/芹菜/icon.png", + "source_sha256": "67d02f361300e5c35a857300246a6938f75327fc99796ff44da3aa0fa1693f5d", + "copied_sha256": "67d02f361300e5c35a857300246a6938f75327fc99796ff44da3aa0fa1693f5d", + "bytes": 11614, + "modification": null + }, + { + "path": "resource/plant/苦瓜/1.png", + "source_sha256": "1b867b253447c4017c088cb92f786a3bf69f04b30894c24e6ca036a8e595c0cf", + "copied_sha256": "1b867b253447c4017c088cb92f786a3bf69f04b30894c24e6ca036a8e595c0cf", + "bytes": 3482, + "modification": null + }, + { + "path": "resource/plant/苦瓜/2.png", + "source_sha256": "9d7a8dd73bb423b0ca16539562fc5acf91c8f4c63d413c962c5f69976c1eff62", + "copied_sha256": "9d7a8dd73bb423b0ca16539562fc5acf91c8f4c63d413c962c5f69976c1eff62", + "bytes": 12315, + "modification": null + }, + { + "path": "resource/plant/苦瓜/3.png", + "source_sha256": "1c08fc26c01b608acd7066304bf12b29ecc1ede9f72aa297c1accd1b3f3c2173", + "copied_sha256": "1c08fc26c01b608acd7066304bf12b29ecc1ede9f72aa297c1accd1b3f3c2173", + "bytes": 16788, + "modification": null + }, + { + "path": "resource/plant/苦瓜/4.png", + "source_sha256": "8b2ce7a3fa04bbd01c28c4049844f0b7b0e0798c3a3612564499608d3dbd3360", + "copied_sha256": "8b2ce7a3fa04bbd01c28c4049844f0b7b0e0798c3a3612564499608d3dbd3360", + "bytes": 19870, + "modification": null + }, + { + "path": "resource/plant/苦瓜/5.png", + "source_sha256": "0d565cc87eb81c53c91ee3a59ffc10104336e48950240048dcdc4ad815d432a8", + "copied_sha256": "0d565cc87eb81c53c91ee3a59ffc10104336e48950240048dcdc4ad815d432a8", + "bytes": 21811, + "modification": null + }, + { + "path": "resource/plant/苦瓜/icon.png", + "source_sha256": "7d27545e0e5fb484a07e11320d961a1adce233e4e79af0074a0075be05eb599b", + "copied_sha256": "7d27545e0e5fb484a07e11320d961a1adce233e4e79af0074a0075be05eb599b", + "bytes": 16732, + "modification": null + }, + { + "path": "resource/plant/苹果/1.png", + "source_sha256": "58489370ad633b70fb837d60182bb71fead19ac0d5d055b0b94848128d6ada09", + "copied_sha256": "58489370ad633b70fb837d60182bb71fead19ac0d5d055b0b94848128d6ada09", + "bytes": 1868, + "modification": null + }, + { + "path": "resource/plant/苹果/2.png", + "source_sha256": "fa703b9efa2f95c7f22768d089c0ba0656aa0e5d040bc71e80de0b3e4fceebfb", + "copied_sha256": "fa703b9efa2f95c7f22768d089c0ba0656aa0e5d040bc71e80de0b3e4fceebfb", + "bytes": 3371, + "modification": null + }, + { + "path": "resource/plant/苹果/3.png", + "source_sha256": "6181a433ba1100c1bc4efc4cce7c2ae4bd9e967fa7ce58000cf1e9348ec93035", + "copied_sha256": "6181a433ba1100c1bc4efc4cce7c2ae4bd9e967fa7ce58000cf1e9348ec93035", + "bytes": 18349, + "modification": null + }, + { + "path": "resource/plant/苹果/4.png", + "source_sha256": "5210b120df524d38353ddc4b93fca03fcf7ad0b3e98ac8f609e91e50cf3978a3", + "copied_sha256": "5210b120df524d38353ddc4b93fca03fcf7ad0b3e98ac8f609e91e50cf3978a3", + "bytes": 20678, + "modification": null + }, + { + "path": "resource/plant/苹果/5.png", + "source_sha256": "0a9b2c863dd1fd4f80f1568e5d809e6a97b2c8c0fdc9f7d8618f90556213d163", + "copied_sha256": "0a9b2c863dd1fd4f80f1568e5d809e6a97b2c8c0fdc9f7d8618f90556213d163", + "bytes": 21153, + "modification": null + }, + { + "path": "resource/plant/苹果/icon.png", + "source_sha256": "08205603d4cfbc1d48256c5a2454713f6b9ee19b7d2e02135b8fbedea3dd8bd2", + "copied_sha256": "08205603d4cfbc1d48256c5a2454713f6b9ee19b7d2e02135b8fbedea3dd8bd2", + "bytes": 7093, + "modification": null + }, + { + "path": "resource/plant/茄子/1.png", + "source_sha256": "4cecea91a8855112274a9e5badc2ed4648395ee6ee25834027202ec884dd54e2", + "copied_sha256": "4cecea91a8855112274a9e5badc2ed4648395ee6ee25834027202ec884dd54e2", + "bytes": 2607, + "modification": null + }, + { + "path": "resource/plant/茄子/2.png", + "source_sha256": "b66daf3e5069b8688de1479fc9d33eda39141d18b6a478d48637620f236fe9da", + "copied_sha256": "b66daf3e5069b8688de1479fc9d33eda39141d18b6a478d48637620f236fe9da", + "bytes": 7384, + "modification": null + }, + { + "path": "resource/plant/茄子/3.png", + "source_sha256": "7442ba729f0d282109794491f2725fbb1cc9dd52134ea596a4910ddfcde01e4f", + "copied_sha256": "7442ba729f0d282109794491f2725fbb1cc9dd52134ea596a4910ddfcde01e4f", + "bytes": 16676, + "modification": null + }, + { + "path": "resource/plant/茄子/4.png", + "source_sha256": "54b2dd799b259cf486cd81b0590bb8dbfce2ca69ec367e69ad65dec776dce69a", + "copied_sha256": "54b2dd799b259cf486cd81b0590bb8dbfce2ca69ec367e69ad65dec776dce69a", + "bytes": 18949, + "modification": null + }, + { + "path": "resource/plant/茄子/5.png", + "source_sha256": "dfc35e0273b5855d488c7ffc550d04a1747d4b9053ef9e0d40508331a195a5f0", + "copied_sha256": "dfc35e0273b5855d488c7ffc550d04a1747d4b9053ef9e0d40508331a195a5f0", + "bytes": 19130, + "modification": null + }, + { + "path": "resource/plant/茄子/icon.png", + "source_sha256": "19024e5f6fa4531dd8d902e2516c9ee28838c1c05c609d1fce2a928b6b954995", + "copied_sha256": "19024e5f6fa4531dd8d902e2516c9ee28838c1c05c609d1fce2a928b6b954995", + "bytes": 7235, + "modification": null + }, + { + "path": "resource/plant/草莓/1.png", + "source_sha256": "41e22d82821a2865861a1b033a1d6b3dd255fe1cfabb66dbee524ad1f856965f", + "copied_sha256": "41e22d82821a2865861a1b033a1d6b3dd255fe1cfabb66dbee524ad1f856965f", + "bytes": 1724, + "modification": null + }, + { + "path": "resource/plant/草莓/2.png", + "source_sha256": "8b7b48aff4ebf32639d745f1cd6686a5b93d1e6a4186a3ec61d0b5d2fb2f5f9d", + "copied_sha256": "8b7b48aff4ebf32639d745f1cd6686a5b93d1e6a4186a3ec61d0b5d2fb2f5f9d", + "bytes": 4115, + "modification": null + }, + { + "path": "resource/plant/草莓/3.png", + "source_sha256": "0bad90f18f477e808d9c1a882c3df9f73342d0459dca3652b20ac6016c21b2ff", + "copied_sha256": "0bad90f18f477e808d9c1a882c3df9f73342d0459dca3652b20ac6016c21b2ff", + "bytes": 9778, + "modification": null + }, + { + "path": "resource/plant/草莓/4.png", + "source_sha256": "b56e1cbe691afa90c0cba8d677faa55e0eb8f8f09caf882cce42e1d22701a57f", + "copied_sha256": "b56e1cbe691afa90c0cba8d677faa55e0eb8f8f09caf882cce42e1d22701a57f", + "bytes": 13661, + "modification": null + }, + { + "path": "resource/plant/草莓/5.png", + "source_sha256": "7349d62a53c2bb81ecf737881b7e6e88849cd4d46869883be0329ab472087be8", + "copied_sha256": "7349d62a53c2bb81ecf737881b7e6e88849cd4d46869883be0329ab472087be8", + "bytes": 19817, + "modification": null + }, + { + "path": "resource/plant/草莓/icon.png", + "source_sha256": "944d31863cb42c60d4c966626ed22ef11aef830a59cc911cd3881415164c2c9d", + "copied_sha256": "944d31863cb42c60d4c966626ed22ef11aef830a59cc911cd3881415164c2c9d", + "bytes": 6581, + "modification": null + }, + { + "path": "resource/plant/荔枝/1.png", + "source_sha256": "ab9b782e02b4ca7986edd43806255d3d148ae37aab7464d8333448bdec03ae8f", + "copied_sha256": "ab9b782e02b4ca7986edd43806255d3d148ae37aab7464d8333448bdec03ae8f", + "bytes": 2042, + "modification": null + }, + { + "path": "resource/plant/荔枝/2.png", + "source_sha256": "269baba50df41791d84cfb31621f41b743fb3cdc0a0d993467d5c96c9c25a7e0", + "copied_sha256": "269baba50df41791d84cfb31621f41b743fb3cdc0a0d993467d5c96c9c25a7e0", + "bytes": 14533, + "modification": null + }, + { + "path": "resource/plant/荔枝/3.png", + "source_sha256": "26589a2c99c4a98a0d26f90a0c7c2b318bb1a117648844508e6e25e80d5cb29c", + "copied_sha256": "26589a2c99c4a98a0d26f90a0c7c2b318bb1a117648844508e6e25e80d5cb29c", + "bytes": 20167, + "modification": null + }, + { + "path": "resource/plant/荔枝/4.png", + "source_sha256": "c7db603fcf3957b5f1e4108f0082f33ad175e1a82e7e5b0ab9b198db49103d5a", + "copied_sha256": "c7db603fcf3957b5f1e4108f0082f33ad175e1a82e7e5b0ab9b198db49103d5a", + "bytes": 21557, + "modification": null + }, + { + "path": "resource/plant/荔枝/5.png", + "source_sha256": "cbf95c2fb840997fef4d2d3cdb6a8f29c548359707f0fc665a031d034ef692bc", + "copied_sha256": "cbf95c2fb840997fef4d2d3cdb6a8f29c548359707f0fc665a031d034ef692bc", + "bytes": 22735, + "modification": null + }, + { + "path": "resource/plant/荔枝/icon.png", + "source_sha256": "2aa93fd50fd3d04bf3711d831571502388943c8f0a3549bd623c78e1b435f8a4", + "copied_sha256": "2aa93fd50fd3d04bf3711d831571502388943c8f0a3549bd623c78e1b435f8a4", + "bytes": 9621, + "modification": null + }, + { + "path": "resource/plant/莲藕/1.png", + "source_sha256": "a42bffcd5739905c108694800a2f9052ab598ef3142ceab32635c7d89fcca822", + "copied_sha256": "a42bffcd5739905c108694800a2f9052ab598ef3142ceab32635c7d89fcca822", + "bytes": 10302, + "modification": null + }, + { + "path": "resource/plant/莲藕/2.png", + "source_sha256": "f1a8d16f644fc05f117ce260802f316c652500d9f184ca6f985de49aa576a533", + "copied_sha256": "f1a8d16f644fc05f117ce260802f316c652500d9f184ca6f985de49aa576a533", + "bytes": 12478, + "modification": null + }, + { + "path": "resource/plant/莲藕/3.png", + "source_sha256": "d334a61e43e98dee4065cd2ae67aaf3f6ad916c0d79c576824c37e381fc035da", + "copied_sha256": "d334a61e43e98dee4065cd2ae67aaf3f6ad916c0d79c576824c37e381fc035da", + "bytes": 13335, + "modification": null + }, + { + "path": "resource/plant/莲藕/4.png", + "source_sha256": "1c9dc807c9f1da6c5aaa852da5e2bbb756b55d3d1dd577f1e3dfa7d338bcc388", + "copied_sha256": "1c9dc807c9f1da6c5aaa852da5e2bbb756b55d3d1dd577f1e3dfa7d338bcc388", + "bytes": 17153, + "modification": null + }, + { + "path": "resource/plant/莲藕/5.png", + "source_sha256": "0994d5e20a46ea66ac8c797c0eb839200880bf9d5782e1e715683ed8aec647fb", + "copied_sha256": "0994d5e20a46ea66ac8c797c0eb839200880bf9d5782e1e715683ed8aec647fb", + "bytes": 20759, + "modification": null + }, + { + "path": "resource/plant/莲藕/icon.png", + "source_sha256": "ea649264fa6a4f38130341d32ce5ee3012406bda3171be2650aa708d2bb7caa9", + "copied_sha256": "ea649264fa6a4f38130341d32ce5ee3012406bda3171be2650aa708d2bb7caa9", + "bytes": 6287, + "modification": null + }, + { + "path": "resource/plant/莲雾/1.png", + "source_sha256": "9431b91d919dd3d1437754974b794c916fcceb03b5951de2fa6bf34ffade136a", + "copied_sha256": "9431b91d919dd3d1437754974b794c916fcceb03b5951de2fa6bf34ffade136a", + "bytes": 3217, + "modification": null + }, + { + "path": "resource/plant/莲雾/2.png", + "source_sha256": "0b0f449a1250e128f788ef0b481a85ace5d344610405ddbaf03bbf8428e08f1a", + "copied_sha256": "0b0f449a1250e128f788ef0b481a85ace5d344610405ddbaf03bbf8428e08f1a", + "bytes": 10271, + "modification": null + }, + { + "path": "resource/plant/莲雾/3.png", + "source_sha256": "3b956d1fad6b50c9240dbb4772806c035579995c7967fa9505932bdb400c29f2", + "copied_sha256": "3b956d1fad6b50c9240dbb4772806c035579995c7967fa9505932bdb400c29f2", + "bytes": 22141, + "modification": null + }, + { + "path": "resource/plant/莲雾/4.png", + "source_sha256": "22426916da13d9914b7f4f75ee929a4389a1f3bdf5d20e1074679220b1f3c11a", + "copied_sha256": "22426916da13d9914b7f4f75ee929a4389a1f3bdf5d20e1074679220b1f3c11a", + "bytes": 26578, + "modification": null + }, + { + "path": "resource/plant/莲雾/5.png", + "source_sha256": "cd6f65f142652de62fb8527ed31349b1f0e4a7b350961f310dd9ccf5ef4b0e94", + "copied_sha256": "cd6f65f142652de62fb8527ed31349b1f0e4a7b350961f310dd9ccf5ef4b0e94", + "bytes": 29105, + "modification": null + }, + { + "path": "resource/plant/莲雾/icon.png", + "source_sha256": "00df393cf5a119b0f63af5450922fcc832f005096ad7462b0b9968e67d365060", + "copied_sha256": "00df393cf5a119b0f63af5450922fcc832f005096ad7462b0b9968e67d365060", + "bytes": 12629, + "modification": null + }, + { + "path": "resource/plant/菠萝/1.png", + "source_sha256": "095bc21487704ebff96be9dca7fec02109de462f7c1b3d16a1d1f0344431c8e5", + "copied_sha256": "095bc21487704ebff96be9dca7fec02109de462f7c1b3d16a1d1f0344431c8e5", + "bytes": 1970, + "modification": null + }, + { + "path": "resource/plant/菠萝/2.png", + "source_sha256": "251f18075ced808660aac387511f105fc3a6eaf36f55fb646e2146f7756a4e9c", + "copied_sha256": "251f18075ced808660aac387511f105fc3a6eaf36f55fb646e2146f7756a4e9c", + "bytes": 5913, + "modification": null + }, + { + "path": "resource/plant/菠萝/3.png", + "source_sha256": "8532c22701df600cafc33d46ce1aaae76098cd55f32b0ad7b269bac3750bf43d", + "copied_sha256": "8532c22701df600cafc33d46ce1aaae76098cd55f32b0ad7b269bac3750bf43d", + "bytes": 18564, + "modification": null + }, + { + "path": "resource/plant/菠萝/4.png", + "source_sha256": "d0c2ed6c65cd745cb6a3b6615eb60cf41001b3b2a1dc9d7707f44cf04f8ee11f", + "copied_sha256": "d0c2ed6c65cd745cb6a3b6615eb60cf41001b3b2a1dc9d7707f44cf04f8ee11f", + "bytes": 18969, + "modification": null + }, + { + "path": "resource/plant/菠萝/5.png", + "source_sha256": "46f4d021e66b9ff16294971ee128f2f0583cf837fa8a04e5460ea9584c90b452", + "copied_sha256": "46f4d021e66b9ff16294971ee128f2f0583cf837fa8a04e5460ea9584c90b452", + "bytes": 20788, + "modification": null + }, + { + "path": "resource/plant/菠萝/icon.png", + "source_sha256": "bd917d4c1f654099c70c0d207d2f25b849dc8233bec2689e41058f59461fe354", + "copied_sha256": "bd917d4c1f654099c70c0d207d2f25b849dc8233bec2689e41058f59461fe354", + "bytes": 9492, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/1.png", + "source_sha256": "01e680897d54eb7760ac9d22fcc0885f39a3d6595816ee27e8468d87b70badc4", + "copied_sha256": "01e680897d54eb7760ac9d22fcc0885f39a3d6595816ee27e8468d87b70badc4", + "bytes": 4444, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/2.png", + "source_sha256": "bc7da7c643c85263cb276677aa495bbd447b77ee0b2928328cb23de27553356e", + "copied_sha256": "bc7da7c643c85263cb276677aa495bbd447b77ee0b2928328cb23de27553356e", + "bytes": 7132, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/3.png", + "source_sha256": "4989ff8f7ce43ff6a59c9c43a369571a9ab01a6697dbf4cfd947ff2f123ed93d", + "copied_sha256": "4989ff8f7ce43ff6a59c9c43a369571a9ab01a6697dbf4cfd947ff2f123ed93d", + "bytes": 14592, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/4.png", + "source_sha256": "ee4520c2ed9cdb82517c5f25eb27c054c7dbc25adf7dc2ddced203645b373d8b", + "copied_sha256": "ee4520c2ed9cdb82517c5f25eb27c054c7dbc25adf7dc2ddced203645b373d8b", + "bytes": 19974, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/5.png", + "source_sha256": "201ba4fd4d32ba75791cd3afc1bdc5dcbb37dfa674fd7f76a9017967b1f9cb70", + "copied_sha256": "201ba4fd4d32ba75791cd3afc1bdc5dcbb37dfa674fd7f76a9017967b1f9cb70", + "bytes": 25959, + "modification": null + }, + { + "path": "resource/plant/菠萝蜜/icon.png", + "source_sha256": "40bb7a2160585857fa2981b373f714ad28f5e26deaa47a5196d709a870bd4788", + "copied_sha256": "40bb7a2160585857fa2981b373f714ad28f5e26deaa47a5196d709a870bd4788", + "bytes": 12465, + "modification": null + }, + { + "path": "resource/plant/葡萄/1.png", + "source_sha256": "e05ea961bb08079022c11cdc0061567bd7d497952e259c8c9460331b57726715", + "copied_sha256": "e05ea961bb08079022c11cdc0061567bd7d497952e259c8c9460331b57726715", + "bytes": 3710, + "modification": null + }, + { + "path": "resource/plant/葡萄/2.png", + "source_sha256": "0aa259ef712cb9a6c9c3aa876dd435d134702aa677c1d6a60d0d9692f8c8f3c3", + "copied_sha256": "0aa259ef712cb9a6c9c3aa876dd435d134702aa677c1d6a60d0d9692f8c8f3c3", + "bytes": 7605, + "modification": null + }, + { + "path": "resource/plant/葡萄/3.png", + "source_sha256": "ab6cad29787576494d550d2c22c4dd785d06c35dc8be4821dc7fc79bbbbe9f6d", + "copied_sha256": "ab6cad29787576494d550d2c22c4dd785d06c35dc8be4821dc7fc79bbbbe9f6d", + "bytes": 23514, + "modification": null + }, + { + "path": "resource/plant/葡萄/4.png", + "source_sha256": "3a68b89f6a2341337fd863c67cf77cdee17b5fd319d12bc867b86ad7ee3708b7", + "copied_sha256": "3a68b89f6a2341337fd863c67cf77cdee17b5fd319d12bc867b86ad7ee3708b7", + "bytes": 27899, + "modification": null + }, + { + "path": "resource/plant/葡萄/5.png", + "source_sha256": "ad3b4a49da8a0c8ca9e9a22bdbbd29b29bda237d45bdc4ca85a0d342e7b128e7", + "copied_sha256": "ad3b4a49da8a0c8ca9e9a22bdbbd29b29bda237d45bdc4ca85a0d342e7b128e7", + "bytes": 25162, + "modification": null + }, + { + "path": "resource/plant/葡萄/icon.png", + "source_sha256": "9f399f41d7edc4557f98173a18b52bf5bb08af54795c359a1ff93f0020d33c41", + "copied_sha256": "9f399f41d7edc4557f98173a18b52bf5bb08af54795c359a1ff93f0020d33c41", + "bytes": 5084, + "modification": null + }, + { + "path": "resource/plant/葫芦/1.png", + "source_sha256": "798cb9262f75503ca5afefdcd4c000a8722e4b9fb70246a4b457bef3c68d37fc", + "copied_sha256": "798cb9262f75503ca5afefdcd4c000a8722e4b9fb70246a4b457bef3c68d37fc", + "bytes": 1719, + "modification": null + }, + { + "path": "resource/plant/葫芦/2.png", + "source_sha256": "953d72d803c002de006564a2a56a3c05d5604644c7c946a0b94c814e000a04c7", + "copied_sha256": "953d72d803c002de006564a2a56a3c05d5604644c7c946a0b94c814e000a04c7", + "bytes": 6464, + "modification": null + }, + { + "path": "resource/plant/葫芦/3.png", + "source_sha256": "5d78e1488b1ddb612700218f0c59eb6f5072c905215d5064f0d518b9df2d8721", + "copied_sha256": "5d78e1488b1ddb612700218f0c59eb6f5072c905215d5064f0d518b9df2d8721", + "bytes": 16228, + "modification": null + }, + { + "path": "resource/plant/葫芦/4.png", + "source_sha256": "e8170e24e1807ec40baf2f0dfd224a6bbce4505fffdd82d9538e45b7322987d6", + "copied_sha256": "e8170e24e1807ec40baf2f0dfd224a6bbce4505fffdd82d9538e45b7322987d6", + "bytes": 23706, + "modification": null + }, + { + "path": "resource/plant/葫芦/5.png", + "source_sha256": "809985462304c16907dc73c60d5e78be51bb214763f92bf899ed6d56a80e61b2", + "copied_sha256": "809985462304c16907dc73c60d5e78be51bb214763f92bf899ed6d56a80e61b2", + "bytes": 25821, + "modification": null + }, + { + "path": "resource/plant/葫芦/icon.png", + "source_sha256": "0f14b06f23483b63133e2a238bdd7a5415db75fc3e9187b650cffb6d003a461c", + "copied_sha256": "0f14b06f23483b63133e2a238bdd7a5415db75fc3e9187b650cffb6d003a461c", + "bytes": 6640, + "modification": null + }, + { + "path": "resource/plant/蓝莓/1.png", + "source_sha256": "db60ee0cc1d84add18c184e2be8335f566f43b07bc33e6ee030af6676eb1cd61", + "copied_sha256": "db60ee0cc1d84add18c184e2be8335f566f43b07bc33e6ee030af6676eb1cd61", + "bytes": 2321, + "modification": null + }, + { + "path": "resource/plant/蓝莓/2.png", + "source_sha256": "f955e71a0f0ef2bea245f9a9eff3dbf8b4d351018eb90b72f9235ae7ac007a03", + "copied_sha256": "f955e71a0f0ef2bea245f9a9eff3dbf8b4d351018eb90b72f9235ae7ac007a03", + "bytes": 4668, + "modification": null + }, + { + "path": "resource/plant/蓝莓/3.png", + "source_sha256": "b61ce54acb086f0e879e218ccc1db52876506ee482bd2650a006054f54417eab", + "copied_sha256": "b61ce54acb086f0e879e218ccc1db52876506ee482bd2650a006054f54417eab", + "bytes": 10705, + "modification": null + }, + { + "path": "resource/plant/蓝莓/4.png", + "source_sha256": "984d082c1942607a3514841a00baa81f9e381bf359e2bbbf8d0fdabe39e3f50f", + "copied_sha256": "984d082c1942607a3514841a00baa81f9e381bf359e2bbbf8d0fdabe39e3f50f", + "bytes": 17508, + "modification": null + }, + { + "path": "resource/plant/蓝莓/5.png", + "source_sha256": "6d2b91a09f7f7f084f25e4897d3487cb87b431b315391872cd6d20947a75b0b5", + "copied_sha256": "6d2b91a09f7f7f084f25e4897d3487cb87b431b315391872cd6d20947a75b0b5", + "bytes": 18500, + "modification": null + }, + { + "path": "resource/plant/蓝莓/icon.png", + "source_sha256": "84e847a089565a529ca5d8a98f3624a70c8685dd81b5d13befa51659c419abcf", + "copied_sha256": "84e847a089565a529ca5d8a98f3624a70c8685dd81b5d13befa51659c419abcf", + "bytes": 8316, + "modification": null + }, + { + "path": "resource/plant/薄荷/1.png", + "source_sha256": "b3c640403fc3044c82a7b53deed4765c7deb566c33b4f194804f8b079096e99f", + "copied_sha256": "b3c640403fc3044c82a7b53deed4765c7deb566c33b4f194804f8b079096e99f", + "bytes": 1294, + "modification": null + }, + { + "path": "resource/plant/薄荷/2.png", + "source_sha256": "97f0efb30a0ca65b0536293e250848af0e2c1ddf16af51c103577f66d15578ac", + "copied_sha256": "97f0efb30a0ca65b0536293e250848af0e2c1ddf16af51c103577f66d15578ac", + "bytes": 7220, + "modification": null + }, + { + "path": "resource/plant/薄荷/3.png", + "source_sha256": "675716bfaed63d2e6288a832ea8abe1ec239f9ef9f1abb55f0b520e43668af59", + "copied_sha256": "675716bfaed63d2e6288a832ea8abe1ec239f9ef9f1abb55f0b520e43668af59", + "bytes": 14483, + "modification": null + }, + { + "path": "resource/plant/薄荷/4.png", + "source_sha256": "d04970084713fc4e795ca2beba6766aa167ab5cb175fb17304711c30c49af96a", + "copied_sha256": "d04970084713fc4e795ca2beba6766aa167ab5cb175fb17304711c30c49af96a", + "bytes": 21460, + "modification": null + }, + { + "path": "resource/plant/薄荷/5.png", + "source_sha256": "ec1fd959ff6ad75c18e2d29da94a990691348ae67f1ffed3f0972b9cf4285a6e", + "copied_sha256": "ec1fd959ff6ad75c18e2d29da94a990691348ae67f1ffed3f0972b9cf4285a6e", + "bytes": 22070, + "modification": null + }, + { + "path": "resource/plant/薄荷/icon.png", + "source_sha256": "8f308a72fe8a928e0198a3d5e16c67359843f09e184be015607d5a3453f48b84", + "copied_sha256": "8f308a72fe8a928e0198a3d5e16c67359843f09e184be015607d5a3453f48b84", + "bytes": 7399, + "modification": null + }, + { + "path": "resource/plant/蘑菇/1.png", + "source_sha256": "f2bb06ef90351e4fb4f10efdcec33ef608ff0f2d173ddd7a707edc708302ed85", + "copied_sha256": "f2bb06ef90351e4fb4f10efdcec33ef608ff0f2d173ddd7a707edc708302ed85", + "bytes": 12941, + "modification": null + }, + { + "path": "resource/plant/蘑菇/2.png", + "source_sha256": "388385d703e59ae9f1190a1ee6b1e74e1a628aba675b459a370fcb5c56d7eb02", + "copied_sha256": "388385d703e59ae9f1190a1ee6b1e74e1a628aba675b459a370fcb5c56d7eb02", + "bytes": 13597, + "modification": null + }, + { + "path": "resource/plant/蘑菇/3.png", + "source_sha256": "4bc6e6be409cbf6f1f0b6124a4263ad8689b6b32f6dbf133aaf43cdc48d0c44a", + "copied_sha256": "4bc6e6be409cbf6f1f0b6124a4263ad8689b6b32f6dbf133aaf43cdc48d0c44a", + "bytes": 16215, + "modification": null + }, + { + "path": "resource/plant/蘑菇/4.png", + "source_sha256": "a9006df5c6e663920657416da0a4928b3059f3d9e849e490266cbd1684902d80", + "copied_sha256": "a9006df5c6e663920657416da0a4928b3059f3d9e849e490266cbd1684902d80", + "bytes": 17492, + "modification": null + }, + { + "path": "resource/plant/蘑菇/5.png", + "source_sha256": "1aa4a1346b3d73e98165272f6ab9fd4a11c56ec85c50fb8188ad02b196fe74f9", + "copied_sha256": "1aa4a1346b3d73e98165272f6ab9fd4a11c56ec85c50fb8188ad02b196fe74f9", + "bytes": 16412, + "modification": null + }, + { + "path": "resource/plant/蘑菇/icon.png", + "source_sha256": "34bf9bbcd9c989431852efc1eb7fddc50a0971afe481f463ff18a474a396f457", + "copied_sha256": "34bf9bbcd9c989431852efc1eb7fddc50a0971afe481f463ff18a474a396f457", + "bytes": 10475, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/1.png", + "source_sha256": "67b8e894d72adb0022f448223c0133e4437f83f9726f6f1cd52979c5ac01a573", + "copied_sha256": "67b8e894d72adb0022f448223c0133e4437f83f9726f6f1cd52979c5ac01a573", + "bytes": 3706, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/2.png", + "source_sha256": "3a1982519e8837f2d5d56941c3451907311655968ac01f15085e18f0fd216702", + "copied_sha256": "3a1982519e8837f2d5d56941c3451907311655968ac01f15085e18f0fd216702", + "bytes": 8603, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/3.png", + "source_sha256": "a4b75fe30365ff258a88604ad111c0810a188981d5f4abada5a9c076d80c492a", + "copied_sha256": "a4b75fe30365ff258a88604ad111c0810a188981d5f4abada5a9c076d80c492a", + "bytes": 18291, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/4.png", + "source_sha256": "a95a9ca8b7cfae263af76c0315a6d47c3997273faf0e0bac2503363472ef6c63", + "copied_sha256": "a95a9ca8b7cfae263af76c0315a6d47c3997273faf0e0bac2503363472ef6c63", + "bytes": 19929, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/5.png", + "source_sha256": "da8ce79a68ad7452407a94203897da6cdcf845702325097b3a351a511381ad87", + "copied_sha256": "da8ce79a68ad7452407a94203897da6cdcf845702325097b3a351a511381ad87", + "bytes": 20879, + "modification": null + }, + { + "path": "resource/plant/蛋黄果/icon.png", + "source_sha256": "711c9216c08ea14c123de56cf2c1229b66b2e61a4fc111bd9950af502ba27adb", + "copied_sha256": "711c9216c08ea14c123de56cf2c1229b66b2e61a4fc111bd9950af502ba27adb", + "bytes": 7998, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/1.png", + "source_sha256": "95b415c1c8091082c25f7cd8260a11ba6849df5ce65902d55d7a17a4be2083f6", + "copied_sha256": "95b415c1c8091082c25f7cd8260a11ba6849df5ce65902d55d7a17a4be2083f6", + "bytes": 1124, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/2.png", + "source_sha256": "85eb9afcae07095dd3366ed6f1e3d0c64fbcc5fe09a7659e8d7dc9cc1b5a55d2", + "copied_sha256": "85eb9afcae07095dd3366ed6f1e3d0c64fbcc5fe09a7659e8d7dc9cc1b5a55d2", + "bytes": 5591, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/3.png", + "source_sha256": "2cafd76d99c5f7e2930e538f186c3924ee35617d3539efd8a5b6783e8f76b478", + "copied_sha256": "2cafd76d99c5f7e2930e538f186c3924ee35617d3539efd8a5b6783e8f76b478", + "bytes": 12029, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/4.png", + "source_sha256": "2a34a2cc318e8494f07cf486b1448602478559d6216780f2e45191f51bcd7a40", + "copied_sha256": "2a34a2cc318e8494f07cf486b1448602478559d6216780f2e45191f51bcd7a40", + "bytes": 23493, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/5.png", + "source_sha256": "6da6064944571b8842fba360ddec19f472938f9aa6504ce9dfb2628e5468f4b7", + "copied_sha256": "6da6064944571b8842fba360ddec19f472938f9aa6504ce9dfb2628e5468f4b7", + "bytes": 34387, + "modification": null + }, + { + "path": "resource/plant/蜜思桃/icon.png", + "source_sha256": "023d21ce3726b4800c7489ac1344ca560060f5e137e87c1fe9aaad548be8d9e2", + "copied_sha256": "023d21ce3726b4800c7489ac1344ca560060f5e137e87c1fe9aaad548be8d9e2", + "bytes": 13033, + "modification": null + }, + { + "path": "resource/plant/西瓜/1.png", + "source_sha256": "dc1504301ffd6d882aafe392838779efe4be07a8c2a935ac75368c5b70760637", + "copied_sha256": "dc1504301ffd6d882aafe392838779efe4be07a8c2a935ac75368c5b70760637", + "bytes": 6181, + "modification": null + }, + { + "path": "resource/plant/西瓜/2.png", + "source_sha256": "6b518eca5d7360d82c863cd62bb277cf9e98b60d8c9cd71ecd8a1a31db650a95", + "copied_sha256": "6b518eca5d7360d82c863cd62bb277cf9e98b60d8c9cd71ecd8a1a31db650a95", + "bytes": 19621, + "modification": null + }, + { + "path": "resource/plant/西瓜/3.png", + "source_sha256": "b1db957942cf02dded0e8d436a1cb5ea8ddac30f431ae3982d5f08935186417d", + "copied_sha256": "b1db957942cf02dded0e8d436a1cb5ea8ddac30f431ae3982d5f08935186417d", + "bytes": 22951, + "modification": null + }, + { + "path": "resource/plant/西瓜/4.png", + "source_sha256": "d3dc0e03998fe57a4b07cde237c5beffe7056b506488c2ceef9c8221c1d62731", + "copied_sha256": "d3dc0e03998fe57a4b07cde237c5beffe7056b506488c2ceef9c8221c1d62731", + "bytes": 26617, + "modification": null + }, + { + "path": "resource/plant/西瓜/5.png", + "source_sha256": "bd9002faa3cf03b6e6e43dbc1fca657a7365221d3bafe6abfcdcf9eeff3916f9", + "copied_sha256": "bd9002faa3cf03b6e6e43dbc1fca657a7365221d3bafe6abfcdcf9eeff3916f9", + "bytes": 30133, + "modification": null + }, + { + "path": "resource/plant/西瓜/icon.png", + "source_sha256": "565b1e9f2a759da7f298736360321a95a91931580f9a72b9af0c91186030f22c", + "copied_sha256": "565b1e9f2a759da7f298736360321a95a91931580f9a72b9af0c91186030f22c", + "bytes": 10661, + "modification": null + }, + { + "path": "resource/plant/豌豆/1.png", + "source_sha256": "463e53f03dabe321c89f38569b850adcbc79c6134ac83a079e339bec4ef9c917", + "copied_sha256": "463e53f03dabe321c89f38569b850adcbc79c6134ac83a079e339bec4ef9c917", + "bytes": 2869, + "modification": null + }, + { + "path": "resource/plant/豌豆/2.png", + "source_sha256": "5376878aa6176600b963150ed73fe72eb54eaa5ed8f5f25fb55fa3eb9fbea031", + "copied_sha256": "5376878aa6176600b963150ed73fe72eb54eaa5ed8f5f25fb55fa3eb9fbea031", + "bytes": 4802, + "modification": null + }, + { + "path": "resource/plant/豌豆/3.png", + "source_sha256": "d615acb5bd4d4eebcc374dc10efc088c43d86b09582a58d68378c340059ab2b8", + "copied_sha256": "d615acb5bd4d4eebcc374dc10efc088c43d86b09582a58d68378c340059ab2b8", + "bytes": 20628, + "modification": null + }, + { + "path": "resource/plant/豌豆/4.png", + "source_sha256": "0fac42e995df75e4a36d600a36a6fba74b444522f2fcfe5a186331f4bc1a7f87", + "copied_sha256": "0fac42e995df75e4a36d600a36a6fba74b444522f2fcfe5a186331f4bc1a7f87", + "bytes": 22154, + "modification": null + }, + { + "path": "resource/plant/豌豆/5.png", + "source_sha256": "05ab191941e33e73b569978e2a44c2fb2273474e4321eaca16881e010341d44a", + "copied_sha256": "05ab191941e33e73b569978e2a44c2fb2273474e4321eaca16881e010341d44a", + "bytes": 22621, + "modification": null + }, + { + "path": "resource/plant/豌豆/icon.png", + "source_sha256": "7c26bda35e10a1ff1287c736b9eaf6bea56faf0cbf22e43b526adb6ab392fb14", + "copied_sha256": "7c26bda35e10a1ff1287c736b9eaf6bea56faf0cbf22e43b526adb6ab392fb14", + "bytes": 7884, + "modification": null + }, + { + "path": "resource/plant/辣椒/1.png", + "source_sha256": "cad6cf4f21be82b06e30f750b423d14e853fff2c34e05d224ecf7e684aba5c58", + "copied_sha256": "cad6cf4f21be82b06e30f750b423d14e853fff2c34e05d224ecf7e684aba5c58", + "bytes": 3116, + "modification": null + }, + { + "path": "resource/plant/辣椒/2.png", + "source_sha256": "273b97ecead4aae60d04de144f0b82d24199284a4df494a40130c5edf54973e1", + "copied_sha256": "273b97ecead4aae60d04de144f0b82d24199284a4df494a40130c5edf54973e1", + "bytes": 7844, + "modification": null + }, + { + "path": "resource/plant/辣椒/3.png", + "source_sha256": "e1ff3074ac02ede871de0003972aac390abd6e9ea9ee226a618918eb8c48da67", + "copied_sha256": "e1ff3074ac02ede871de0003972aac390abd6e9ea9ee226a618918eb8c48da67", + "bytes": 15935, + "modification": null + }, + { + "path": "resource/plant/辣椒/4.png", + "source_sha256": "99a54d6f5f7dbd3f39f99346a81a390654bb988cb074d8730697dc1409bb46c6", + "copied_sha256": "99a54d6f5f7dbd3f39f99346a81a390654bb988cb074d8730697dc1409bb46c6", + "bytes": 21480, + "modification": null + }, + { + "path": "resource/plant/辣椒/5.png", + "source_sha256": "b13c5c25600e657f0eeeb255f365c540c97d52d3b80ae99f53312f0917435768", + "copied_sha256": "b13c5c25600e657f0eeeb255f365c540c97d52d3b80ae99f53312f0917435768", + "bytes": 21058, + "modification": null + }, + { + "path": "resource/plant/辣椒/icon.png", + "source_sha256": "a11c0b3b165b7ddaae6cffd7679bb7f0af747a02b9984f962193f4cb247ff6ed", + "copied_sha256": "a11c0b3b165b7ddaae6cffd7679bb7f0af747a02b9984f962193f4cb247ff6ed", + "bytes": 4043, + "modification": null + }, + { + "path": "resource/plant/迎春花/1.png", + "source_sha256": "e0149f31c9d867a370a6798bf0236fcd7f8628383b5ef0f2b144b20cc9d4eb6e", + "copied_sha256": "e0149f31c9d867a370a6798bf0236fcd7f8628383b5ef0f2b144b20cc9d4eb6e", + "bytes": 949, + "modification": null + }, + { + "path": "resource/plant/迎春花/2.png", + "source_sha256": "4c932cd6eeb59f3724d465f4e5edfc33e49de7aec364b4503f82a0030d78e31e", + "copied_sha256": "4c932cd6eeb59f3724d465f4e5edfc33e49de7aec364b4503f82a0030d78e31e", + "bytes": 5350, + "modification": null + }, + { + "path": "resource/plant/迎春花/3.png", + "source_sha256": "d85f5ea08431193d0e8d88c65ed36edfb7784f9d2f60b915e9c480365d16ac44", + "copied_sha256": "d85f5ea08431193d0e8d88c65ed36edfb7784f9d2f60b915e9c480365d16ac44", + "bytes": 13928, + "modification": null + }, + { + "path": "resource/plant/迎春花/4.png", + "source_sha256": "3f837da23e87f044faf4e1bfbc905f0ed9baefa1c79bda2c30a00ef63a90b8c4", + "copied_sha256": "3f837da23e87f044faf4e1bfbc905f0ed9baefa1c79bda2c30a00ef63a90b8c4", + "bytes": 17276, + "modification": null + }, + { + "path": "resource/plant/迎春花/5.png", + "source_sha256": "f4a1df28db40b0d0edb415c34689a3ad9c276098ec0f941c579ac0a894242116", + "copied_sha256": "f4a1df28db40b0d0edb415c34689a3ad9c276098ec0f941c579ac0a894242116", + "bytes": 19594, + "modification": null + }, + { + "path": "resource/plant/迎春花/icon.png", + "source_sha256": "d3716ccd92ba69849982cd4571be6987f663cd25364361d3134c2ecd098302d8", + "copied_sha256": "d3716ccd92ba69849982cd4571be6987f663cd25364361d3134c2ecd098302d8", + "bytes": 7442, + "modification": null + }, + { + "path": "resource/plant/金桔/1.png", + "source_sha256": "0fce76a54e6b4c43171737eb2bcbabfc12c2185c195a644395ccc48705e7e8f6", + "copied_sha256": "0fce76a54e6b4c43171737eb2bcbabfc12c2185c195a644395ccc48705e7e8f6", + "bytes": 3333, + "modification": null + }, + { + "path": "resource/plant/金桔/2.png", + "source_sha256": "1758c9145210ad1e853a2879bb3face9190c994c726d61a0f1e7f2e14fa1bd14", + "copied_sha256": "1758c9145210ad1e853a2879bb3face9190c994c726d61a0f1e7f2e14fa1bd14", + "bytes": 8380, + "modification": null + }, + { + "path": "resource/plant/金桔/3.png", + "source_sha256": "0c944112f99244ade5b6398e6ff3398257a3b2c25cf23dd3c4a0c4c129fd5dbf", + "copied_sha256": "0c944112f99244ade5b6398e6ff3398257a3b2c25cf23dd3c4a0c4c129fd5dbf", + "bytes": 17525, + "modification": null + }, + { + "path": "resource/plant/金桔/4.png", + "source_sha256": "291db6a7e1227629c72a5953162cffac7cad834103d63e3532078470239edfb0", + "copied_sha256": "291db6a7e1227629c72a5953162cffac7cad834103d63e3532078470239edfb0", + "bytes": 21047, + "modification": null + }, + { + "path": "resource/plant/金桔/5.png", + "source_sha256": "bd3eab848d57122e153daf8975786c98f77c5b05339bad5117c15b6f0d82632b", + "copied_sha256": "bd3eab848d57122e153daf8975786c98f77c5b05339bad5117c15b6f0d82632b", + "bytes": 21631, + "modification": null + }, + { + "path": "resource/plant/金桔/icon.png", + "source_sha256": "82a1ce985cd3610d4491f3866fac3a287932bcf48915984e58e7f1895ac07989", + "copied_sha256": "82a1ce985cd3610d4491f3866fac3a287932bcf48915984e58e7f1895ac07989", + "bytes": 9913, + "modification": null + }, + { + "path": "resource/plant/金针菇/1.png", + "source_sha256": "1efed26ac1425139ffa3d98d11f611bac4477b8a79e92cc853b858775051062d", + "copied_sha256": "1efed26ac1425139ffa3d98d11f611bac4477b8a79e92cc853b858775051062d", + "bytes": 9213, + "modification": null + }, + { + "path": "resource/plant/金针菇/2.png", + "source_sha256": "e566734bc86cca91b6a88f4ee2ce46327433a1a8475609b5ca6f11b08b64c44c", + "copied_sha256": "e566734bc86cca91b6a88f4ee2ce46327433a1a8475609b5ca6f11b08b64c44c", + "bytes": 10033, + "modification": null + }, + { + "path": "resource/plant/金针菇/3.png", + "source_sha256": "c5efbe64b713192e8c73b874797296e2450325e4e5fc4aa7c175175eaa212030", + "copied_sha256": "c5efbe64b713192e8c73b874797296e2450325e4e5fc4aa7c175175eaa212030", + "bytes": 13473, + "modification": null + }, + { + "path": "resource/plant/金针菇/4.png", + "source_sha256": "c6ad828cc46f5587c62027bed8ab544a0ef27b133153eda4668da732811fac4f", + "copied_sha256": "c6ad828cc46f5587c62027bed8ab544a0ef27b133153eda4668da732811fac4f", + "bytes": 17170, + "modification": null + }, + { + "path": "resource/plant/金针菇/5.png", + "source_sha256": "d38c274278c5cbadacddaf75d4b1da6c51f9757d611291352c4d56b33b8aecc6", + "copied_sha256": "d38c274278c5cbadacddaf75d4b1da6c51f9757d611291352c4d56b33b8aecc6", + "bytes": 26097, + "modification": null + }, + { + "path": "resource/plant/金针菇/icon.png", + "source_sha256": "b041fa88ca183a60fd86041bf4f496c05ac939a878c1b6a19609aa781b7f7a9a", + "copied_sha256": "b041fa88ca183a60fd86041bf4f496c05ac939a878c1b6a19609aa781b7f7a9a", + "bytes": 16655, + "modification": null + }, + { + "path": "resource/plant/韭菜/1.png", + "source_sha256": "6484bed7cc56f4f063e43df193c227524ad39e2b4c231c5bd31f911e410f09d5", + "copied_sha256": "6484bed7cc56f4f063e43df193c227524ad39e2b4c231c5bd31f911e410f09d5", + "bytes": 650, + "modification": null + }, + { + "path": "resource/plant/韭菜/2.png", + "source_sha256": "e561364959b91bc9a2ca12f74da149e303110b707862583d380c475e901c66dc", + "copied_sha256": "e561364959b91bc9a2ca12f74da149e303110b707862583d380c475e901c66dc", + "bytes": 2007, + "modification": null + }, + { + "path": "resource/plant/韭菜/3.png", + "source_sha256": "c78ffd20a16d626ef2adac8d593efe3f52cb6accae03a76a525ed0d35f501f94", + "copied_sha256": "c78ffd20a16d626ef2adac8d593efe3f52cb6accae03a76a525ed0d35f501f94", + "bytes": 5186, + "modification": null + }, + { + "path": "resource/plant/韭菜/4.png", + "source_sha256": "98b83721285dbb372956bb1f80f579ec051cf80755173d300dc0c43eff667e45", + "copied_sha256": "98b83721285dbb372956bb1f80f579ec051cf80755173d300dc0c43eff667e45", + "bytes": 10719, + "modification": null + }, + { + "path": "resource/plant/韭菜/5.png", + "source_sha256": "1a7874a3d67e31cb3313aa7e0fcd2ff92e999ee52ce919a7f6b9b81717f6634e", + "copied_sha256": "1a7874a3d67e31cb3313aa7e0fcd2ff92e999ee52ce919a7f6b9b81717f6634e", + "bytes": 18362, + "modification": null + }, + { + "path": "resource/plant/韭菜/icon.png", + "source_sha256": "09ec856ee984c8f99b0ddb2c3e1a26f77cebb3213e8fe9ae2434970bce0fb8ca", + "copied_sha256": "09ec856ee984c8f99b0ddb2c3e1a26f77cebb3213e8fe9ae2434970bce0fb8ca", + "bytes": 5304, + "modification": null + }, + { + "path": "resource/plant/香瓜/1.png", + "source_sha256": "e9a0f7426ea94c97464bb5fd90b5473373f6657a705dd426898dcb358dfb4f09", + "copied_sha256": "e9a0f7426ea94c97464bb5fd90b5473373f6657a705dd426898dcb358dfb4f09", + "bytes": 2425, + "modification": null + }, + { + "path": "resource/plant/香瓜/2.png", + "source_sha256": "797b3798001f6b6bc7b597ebfed40642a2eec38c431cb821c2ea9c9cf19a4f8d", + "copied_sha256": "797b3798001f6b6bc7b597ebfed40642a2eec38c431cb821c2ea9c9cf19a4f8d", + "bytes": 4325, + "modification": null + }, + { + "path": "resource/plant/香瓜/3.png", + "source_sha256": "bc2d5b0eb47ce0525c52e28ef95ff81a285e9be8702cb89c91e9d31a76f33e70", + "copied_sha256": "bc2d5b0eb47ce0525c52e28ef95ff81a285e9be8702cb89c91e9d31a76f33e70", + "bytes": 15031, + "modification": null + }, + { + "path": "resource/plant/香瓜/4.png", + "source_sha256": "18c616bf3235796e4d3dfa3fef58ecb7247b708bb99970de2c0f927ce4647b1d", + "copied_sha256": "18c616bf3235796e4d3dfa3fef58ecb7247b708bb99970de2c0f927ce4647b1d", + "bytes": 15563, + "modification": null + }, + { + "path": "resource/plant/香瓜/5.png", + "source_sha256": "160c9d7f91c2ddf4d734fcd5d8f16fefb83918e982f126b70ce0b859a20208bc", + "copied_sha256": "160c9d7f91c2ddf4d734fcd5d8f16fefb83918e982f126b70ce0b859a20208bc", + "bytes": 15531, + "modification": null + }, + { + "path": "resource/plant/香瓜/icon.png", + "source_sha256": "7f2054256e9c745f1ba3c1feaffe0e660eb3b7851a72477cabc0401f89021416", + "copied_sha256": "7f2054256e9c745f1ba3c1feaffe0e660eb3b7851a72477cabc0401f89021416", + "bytes": 8467, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/1.png", + "source_sha256": "793cf8100c4ae38f23a9a49446f3eb5a06ae5fa3238653cd4f36ec54486850f5", + "copied_sha256": "793cf8100c4ae38f23a9a49446f3eb5a06ae5fa3238653cd4f36ec54486850f5", + "bytes": 12298, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/2.png", + "source_sha256": "54242b5a4c6bf02a6a12656a9daae3ebcb8e7dae2dea38e2338df2eded747193", + "copied_sha256": "54242b5a4c6bf02a6a12656a9daae3ebcb8e7dae2dea38e2338df2eded747193", + "bytes": 14139, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/3.png", + "source_sha256": "0bf9282bf472fcef60211b725fe355fccd1ff93532961abf8b9399e8ebe34897", + "copied_sha256": "0bf9282bf472fcef60211b725fe355fccd1ff93532961abf8b9399e8ebe34897", + "bytes": 19352, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/4.png", + "source_sha256": "31aecd0505949f08abfc76f409d1ae7e6fed97a85c3c5e43362bc9ec0a391ff8", + "copied_sha256": "31aecd0505949f08abfc76f409d1ae7e6fed97a85c3c5e43362bc9ec0a391ff8", + "bytes": 25098, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/5.png", + "source_sha256": "c7ac99320e206eb7e3d4af5e2ef4462bb3dc8cd251b8920825acfd9c71fac54c", + "copied_sha256": "c7ac99320e206eb7e3d4af5e2ef4462bb3dc8cd251b8920825acfd9c71fac54c", + "bytes": 34910, + "modification": null + }, + { + "path": "resource/plant/香粽龙舟/icon.png", + "source_sha256": "3f6004e1e6c217d47caf8d7af37d1bc507088501613f3847270539e267db6a00", + "copied_sha256": "3f6004e1e6c217d47caf8d7af37d1bc507088501613f3847270539e267db6a00", + "bytes": 27220, + "modification": null + }, + { + "path": "resource/plant/香蕉/1.png", + "source_sha256": "26113d5aea6bdd7a8683facc6d59c6e84fe003e910239968a776ccff807636f4", + "copied_sha256": "26113d5aea6bdd7a8683facc6d59c6e84fe003e910239968a776ccff807636f4", + "bytes": 3868, + "modification": null + }, + { + "path": "resource/plant/香蕉/2.png", + "source_sha256": "678283113bd1726485a08d3468d029669dc79784d054dba37998e5d63fc54761", + "copied_sha256": "678283113bd1726485a08d3468d029669dc79784d054dba37998e5d63fc54761", + "bytes": 6280, + "modification": null + }, + { + "path": "resource/plant/香蕉/3.png", + "source_sha256": "29252b848974569d837d344f802749001359bcafbf4f67c5a837f24cbf1c3a4c", + "copied_sha256": "29252b848974569d837d344f802749001359bcafbf4f67c5a837f24cbf1c3a4c", + "bytes": 14121, + "modification": null + }, + { + "path": "resource/plant/香蕉/4.png", + "source_sha256": "79ea86f7b89b758b0c7f3d57efec071f89a439a177af7b29a206b06a62ce0e38", + "copied_sha256": "79ea86f7b89b758b0c7f3d57efec071f89a439a177af7b29a206b06a62ce0e38", + "bytes": 16497, + "modification": null + }, + { + "path": "resource/plant/香蕉/5.png", + "source_sha256": "f3d01f1eadacdf5d6686dc591377db8c28ef59872f8961bfce568ebd3f679b0f", + "copied_sha256": "f3d01f1eadacdf5d6686dc591377db8c28ef59872f8961bfce568ebd3f679b0f", + "bytes": 20083, + "modification": null + }, + { + "path": "resource/plant/香蕉/icon.png", + "source_sha256": "d1178061c5c8ff223bf1f39f240fae211567f623379f78b46329515c811f6bab", + "copied_sha256": "d1178061c5c8ff223bf1f39f240fae211567f623379f78b46329515c811f6bab", + "bytes": 11451, + "modification": null + }, + { + "path": "resource/plant/魔法神花/1.png", + "source_sha256": "bf44267bd05bc2998321c53891d14cc1e94d4434a6af0cb4fce114aa5fb7b5d9", + "copied_sha256": "bf44267bd05bc2998321c53891d14cc1e94d4434a6af0cb4fce114aa5fb7b5d9", + "bytes": 1698, + "modification": null + }, + { + "path": "resource/plant/魔法神花/2.png", + "source_sha256": "6b45f47e76bf971da657093b1a1f56dddfeb194d59b03503d285a1468c7aa878", + "copied_sha256": "6b45f47e76bf971da657093b1a1f56dddfeb194d59b03503d285a1468c7aa878", + "bytes": 3079, + "modification": null + }, + { + "path": "resource/plant/魔法神花/3.png", + "source_sha256": "1f26b8348d48a8ffc4244000a74124205ca50bd581bd08231db5c101ed356fe4", + "copied_sha256": "1f26b8348d48a8ffc4244000a74124205ca50bd581bd08231db5c101ed356fe4", + "bytes": 7840, + "modification": null + }, + { + "path": "resource/plant/魔法神花/4.png", + "source_sha256": "16036cb12a04bfd29e42b3a5479d8f8e14ac34a786dd12c25a400409349398b3", + "copied_sha256": "16036cb12a04bfd29e42b3a5479d8f8e14ac34a786dd12c25a400409349398b3", + "bytes": 12520, + "modification": null + }, + { + "path": "resource/plant/魔法神花/5.png", + "source_sha256": "7447674dd8efe1702ff39be9264f5e5ef6483a417c831124d1680500022e9736", + "copied_sha256": "7447674dd8efe1702ff39be9264f5e5ef6483a417c831124d1680500022e9736", + "bytes": 18719, + "modification": null + }, + { + "path": "resource/plant/魔法神花/icon.png", + "source_sha256": "617a0fe04f538f41e8eba451c2c10dfb870185e4dcc50b76610c4b003a43f8e7", + "copied_sha256": "617a0fe04f538f41e8eba451c2c10dfb870185e4dcc50b76610c4b003a43f8e7", + "bytes": 13698, + "modification": null + }, + { + "path": "resource/plant/鳄梨/1.png", + "source_sha256": "1a7b47812af0c21ea1f53efc98650c66b880c7a18311e0832680620ac2f533ae", + "copied_sha256": "1a7b47812af0c21ea1f53efc98650c66b880c7a18311e0832680620ac2f533ae", + "bytes": 4692, + "modification": null + }, + { + "path": "resource/plant/鳄梨/2.png", + "source_sha256": "6768e030a436831e80ef12d9a8ae52fa9a90fc17954ddd136d0ccb5b6d089b86", + "copied_sha256": "6768e030a436831e80ef12d9a8ae52fa9a90fc17954ddd136d0ccb5b6d089b86", + "bytes": 13067, + "modification": null + }, + { + "path": "resource/plant/鳄梨/3.png", + "source_sha256": "914ba6a762a18c68cf650ac9e86539be73ff83d48e9b553b2deb8d9a93db9342", + "copied_sha256": "914ba6a762a18c68cf650ac9e86539be73ff83d48e9b553b2deb8d9a93db9342", + "bytes": 23750, + "modification": null + }, + { + "path": "resource/plant/鳄梨/4.png", + "source_sha256": "7ef94de28e332b8e520c1a34e97d5e0a638a12d1b31ec50239e551c7bcff5689", + "copied_sha256": "7ef94de28e332b8e520c1a34e97d5e0a638a12d1b31ec50239e551c7bcff5689", + "bytes": 25513, + "modification": null + }, + { + "path": "resource/plant/鳄梨/5.png", + "source_sha256": "0ad96b0ebdc828ecd946fd36c5e230bb631538dddb165ffdd7595cd74e8676f0", + "copied_sha256": "0ad96b0ebdc828ecd946fd36c5e230bb631538dddb165ffdd7595cd74e8676f0", + "bytes": 26774, + "modification": null + }, + { + "path": "resource/plant/鳄梨/icon.png", + "source_sha256": "97e6ecca16bb17dc8f7f6563fa8dd1e3dcf18f7f69282b9bd998b0899d35c1bb", + "copied_sha256": "97e6ecca16bb17dc8f7f6563fa8dd1e3dcf18f7f69282b9bd998b0899d35c1bb", + "bytes": 11036, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/1.png", + "source_sha256": "78e0d517e688d84f7a5802ba141098c6d9213d76b505cc590c51867c52fb6e90", + "copied_sha256": "78e0d517e688d84f7a5802ba141098c6d9213d76b505cc590c51867c52fb6e90", + "bytes": 1019, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/2.png", + "source_sha256": "6d0e5821868427e2a02b6727c2cbb6d6d4ff55026026c09cd3dc1341e7bd321f", + "copied_sha256": "6d0e5821868427e2a02b6727c2cbb6d6d4ff55026026c09cd3dc1341e7bd321f", + "bytes": 1491, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/3.png", + "source_sha256": "f63e678de50abd562bad26af022e05b69040ba47d69a2bad146e9ef78de6ee2f", + "copied_sha256": "f63e678de50abd562bad26af022e05b69040ba47d69a2bad146e9ef78de6ee2f", + "bytes": 2758, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/4.png", + "source_sha256": "82e0661e13984347cc814696e9987779d6bbf30e4d2777d6517525b0edfa859a", + "copied_sha256": "82e0661e13984347cc814696e9987779d6bbf30e4d2777d6517525b0edfa859a", + "bytes": 6472, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/5.png", + "source_sha256": "609e48fb623d3fd15ad9534aa3aa26ac6ecf9320a85a966a0458a20149bfb8c9", + "copied_sha256": "609e48fb623d3fd15ad9534aa3aa26ac6ecf9320a85a966a0458a20149bfb8c9", + "bytes": 9784, + "modification": null + }, + { + "path": "resource/plant/鸾风玉/icon.png", + "source_sha256": "f31e3df709911938f57e1fcc945cffca9672bdecfe2c414abd4a0efda0f1b585", + "copied_sha256": "f31e3df709911938f57e1fcc945cffca9672bdecfe2c414abd4a0efda0f1b585", + "bytes": 9527, + "modification": null + }, + { + "path": "resource/plant/黄瓜/1.png", + "source_sha256": "1723dadabbf560369da0e36135481a03c8b841f3eaf5b778b0834d865080a3a7", + "copied_sha256": "1723dadabbf560369da0e36135481a03c8b841f3eaf5b778b0834d865080a3a7", + "bytes": 2896, + "modification": null + }, + { + "path": "resource/plant/黄瓜/2.png", + "source_sha256": "ee7895a1fc9821ef501d65130238e61ac4eba744d5b6e8e44515eb20f8484f0c", + "copied_sha256": "ee7895a1fc9821ef501d65130238e61ac4eba744d5b6e8e44515eb20f8484f0c", + "bytes": 10038, + "modification": null + }, + { + "path": "resource/plant/黄瓜/3.png", + "source_sha256": "4d94e5c0c41db9438e56df7a6cdfcd6744e67c121ec4b8bb0e378f11e3275a12", + "copied_sha256": "4d94e5c0c41db9438e56df7a6cdfcd6744e67c121ec4b8bb0e378f11e3275a12", + "bytes": 14562, + "modification": null + }, + { + "path": "resource/plant/黄瓜/4.png", + "source_sha256": "e92042585b90cc6f914872106eff5ca50bd8ba0ac5a667a23b0697130ce8fd98", + "copied_sha256": "e92042585b90cc6f914872106eff5ca50bd8ba0ac5a667a23b0697130ce8fd98", + "bytes": 18589, + "modification": null + }, + { + "path": "resource/plant/黄瓜/5.png", + "source_sha256": "de0bd5d49d6041cd020890c96ffda6a42f843d11779026643d0052c33519d993", + "copied_sha256": "de0bd5d49d6041cd020890c96ffda6a42f843d11779026643d0052c33519d993", + "bytes": 18540, + "modification": null + }, + { + "path": "resource/plant/黄瓜/icon.png", + "source_sha256": "c6fa3643a120a6fe8c27612b5c47148f7113220b3b38c638f94bacd372858376", + "copied_sha256": "c6fa3643a120a6fe8c27612b5c47148f7113220b3b38c638f94bacd372858376", + "bytes": 11102, + "modification": null + }, + { + "path": "resource/plant/黄豆/1.png", + "source_sha256": "ff6415449012472d8e6b3bec8bc6f715eef0e54b5a01fb1b5f0d85df831a4fdd", + "copied_sha256": "ff6415449012472d8e6b3bec8bc6f715eef0e54b5a01fb1b5f0d85df831a4fdd", + "bytes": 822, + "modification": null + }, + { + "path": "resource/plant/黄豆/2.png", + "source_sha256": "70cc8d13d023c0568f2fc808b459efc6415c7e5cd2bdf128c46c5feb7cdaebcd", + "copied_sha256": "70cc8d13d023c0568f2fc808b459efc6415c7e5cd2bdf128c46c5feb7cdaebcd", + "bytes": 2745, + "modification": null + }, + { + "path": "resource/plant/黄豆/3.png", + "source_sha256": "2d9424f17e0c05a8453faee7b193d2ce53b5a2c81cfacc01987fd5487c02dcd5", + "copied_sha256": "2d9424f17e0c05a8453faee7b193d2ce53b5a2c81cfacc01987fd5487c02dcd5", + "bytes": 9539, + "modification": null + }, + { + "path": "resource/plant/黄豆/4.png", + "source_sha256": "7b2869bfbad9361e529cbb7f6355e2f56633c98b683f0c75fe5a2975905daffa", + "copied_sha256": "7b2869bfbad9361e529cbb7f6355e2f56633c98b683f0c75fe5a2975905daffa", + "bytes": 15374, + "modification": null + }, + { + "path": "resource/plant/黄豆/5.png", + "source_sha256": "62fa2ff226d544c5161d3c0e89a7a2cf56dd17c6178df6816765a9fc44d97cb0", + "copied_sha256": "62fa2ff226d544c5161d3c0e89a7a2cf56dd17c6178df6816765a9fc44d97cb0", + "bytes": 19669, + "modification": null + }, + { + "path": "resource/plant/黄豆/icon.png", + "source_sha256": "7069a8142199e179732b3bbeeec5a0cb695e9ae60e2ef03fd525293303026516", + "copied_sha256": "7069a8142199e179732b3bbeeec5a0cb695e9ae60e2ef03fd525293303026516", + "bytes": 9444, + "modification": null + }, + { + "path": "resource/plant/黄金果/1.png", + "source_sha256": "8e0cf31997462d93f09657dab30d73f51cd8ee4b89135a074ff1574aa073d55b", + "copied_sha256": "8e0cf31997462d93f09657dab30d73f51cd8ee4b89135a074ff1574aa073d55b", + "bytes": 1366, + "modification": null + }, + { + "path": "resource/plant/黄金果/2.png", + "source_sha256": "9e718a303342baef2b4e1ab5d96d8448d8eb088d6834876d3dc3afe0e7c5515e", + "copied_sha256": "9e718a303342baef2b4e1ab5d96d8448d8eb088d6834876d3dc3afe0e7c5515e", + "bytes": 7223, + "modification": null + }, + { + "path": "resource/plant/黄金果/3.png", + "source_sha256": "534bb23664b33a8cd1b16225ae883cb1936a850a404de251be5cbde0b833f070", + "copied_sha256": "534bb23664b33a8cd1b16225ae883cb1936a850a404de251be5cbde0b833f070", + "bytes": 16432, + "modification": null + }, + { + "path": "resource/plant/黄金果/4.png", + "source_sha256": "01014d13fb7c3f73842aa71df861f8dc5207e64f33e80182f7928b60b3c5dec5", + "copied_sha256": "01014d13fb7c3f73842aa71df861f8dc5207e64f33e80182f7928b60b3c5dec5", + "bytes": 24496, + "modification": null + }, + { + "path": "resource/plant/黄金果/5.png", + "source_sha256": "3b3167c728b87a47f9ee0fe203f83ed4cbe2757bf50579c26979181c5405daa5", + "copied_sha256": "3b3167c728b87a47f9ee0fe203f83ed4cbe2757bf50579c26979181c5405daa5", + "bytes": 23496, + "modification": null + }, + { + "path": "resource/plant/黄金果/icon.png", + "source_sha256": "4945db2c8b11bad1048b3b01958d9ca7aaed72e35d1fb1da0fc2018553bf76f1", + "copied_sha256": "4945db2c8b11bad1048b3b01958d9ca7aaed72e35d1fb1da0fc2018553bf76f1", + "bytes": 10751, + "modification": null + }, + { + "path": "resource/plant/黑布仑/1.png", + "source_sha256": "ccf4770a84d99074922b0b968ecf4abb0a842a6716c8bc25983897c88a3ac58c", + "copied_sha256": "ccf4770a84d99074922b0b968ecf4abb0a842a6716c8bc25983897c88a3ac58c", + "bytes": 1602, + "modification": null + }, + { + "path": "resource/plant/黑布仑/2.png", + "source_sha256": "e2b55bcf9a6719cff7079128da38f2d063b1fe0ed398486319b0ebde71d239f3", + "copied_sha256": "e2b55bcf9a6719cff7079128da38f2d063b1fe0ed398486319b0ebde71d239f3", + "bytes": 10490, + "modification": null + }, + { + "path": "resource/plant/黑布仑/3.png", + "source_sha256": "257d1e1786b53c93f85dbd18e03fd3a4c4e19dc8583767fd0b15f1d511165814", + "copied_sha256": "257d1e1786b53c93f85dbd18e03fd3a4c4e19dc8583767fd0b15f1d511165814", + "bytes": 19946, + "modification": null + }, + { + "path": "resource/plant/黑布仑/4.png", + "source_sha256": "962bf983d96eaff024fdabe097fb1dca7f95065a5f949c354a174a4179c60c2a", + "copied_sha256": "962bf983d96eaff024fdabe097fb1dca7f95065a5f949c354a174a4179c60c2a", + "bytes": 31129, + "modification": null + }, + { + "path": "resource/plant/黑布仑/5.png", + "source_sha256": "aad1daadc5775a7cef642fea6904c7dfee5e0dd859fa378571f87e3fe6494859", + "copied_sha256": "aad1daadc5775a7cef642fea6904c7dfee5e0dd859fa378571f87e3fe6494859", + "bytes": 33295, + "modification": null + }, + { + "path": "resource/plant/黑布仑/icon.png", + "source_sha256": "e37560c9702a3791acb2855fbe6fa9f1df8ebfb59606734218db31fdedb2e590", + "copied_sha256": "e37560c9702a3791acb2855fbe6fa9f1df8ebfb59606734218db31fdedb2e590", + "bytes": 11222, + "modification": null + }, + { + "path": "resource/soil/普通土地-施肥.png", + "source_sha256": "7313024abdda2209fa9b9fc819a188cffe43339b537d31880b65081f52a018bb", + "copied_sha256": "7313024abdda2209fa9b9fc819a188cffe43339b537d31880b65081f52a018bb", + "bytes": 16778, + "modification": null + }, + { + "path": "resource/soil/普通土地-缺水.png", + "source_sha256": "e66275c6af4b3854ca5cbde8389eede1a4e8ffe8f7d8567bed69180411196380", + "copied_sha256": "e66275c6af4b3854ca5cbde8389eede1a4e8ffe8f7d8567bed69180411196380", + "bytes": 33553, + "modification": null + }, + { + "path": "resource/soil/普通土地.png", + "source_sha256": "3df323044913fe5fd1a3aa5f4b35e244c78ef68b4357a88068a5390556ce582e", + "copied_sha256": "3df323044913fe5fd1a3aa5f4b35e244c78ef68b4357a88068a5390556ce582e", + "bytes": 29468, + "modification": null + }, + { + "path": "resource/soil/紫金土地-施肥.png", + "source_sha256": "550f743da7c9ad29d5dc1d9236222e1ee99e37e68acafd61a290cb966852088e", + "copied_sha256": "550f743da7c9ad29d5dc1d9236222e1ee99e37e68acafd61a290cb966852088e", + "bytes": 20943, + "modification": null + }, + { + "path": "resource/soil/紫金土地-缺水.png", + "source_sha256": "3b761d8cefbe552b807dd4ea1e2a4983395b1bbc24cfdffcdeb3d7ac6173744a", + "copied_sha256": "3b761d8cefbe552b807dd4ea1e2a4983395b1bbc24cfdffcdeb3d7ac6173744a", + "bytes": 23577, + "modification": null + }, + { + "path": "resource/soil/紫金土地.png", + "source_sha256": "53d30de4cdc6c0123294b1a018d122989535c0d8f1779af531af2d4e36f12716", + "copied_sha256": "53d30de4cdc6c0123294b1a018d122989535c0d8f1779af531af2d4e36f12716", + "bytes": 21685, + "modification": null + }, + { + "path": "resource/soil/红土地-施肥.png", + "source_sha256": "aac3db2d64f8f45020e073e3b3e7a765a4214752a5548af173f055e6064cf2a1", + "copied_sha256": "aac3db2d64f8f45020e073e3b3e7a765a4214752a5548af173f055e6064cf2a1", + "bytes": 19502, + "modification": null + }, + { + "path": "resource/soil/红土地-缺水.png", + "source_sha256": "061302b158101f5b044efdc5f0857174a4b6ca0c11ff5712528b56d2dfee56f4", + "copied_sha256": "061302b158101f5b044efdc5f0857174a4b6ca0c11ff5712528b56d2dfee56f4", + "bytes": 20649, + "modification": null + }, + { + "path": "resource/soil/红土地.png", + "source_sha256": "b94b07830f6a35f4cfb1fa83c53fb47bca6546a2cb8c2420fe3c37371d98589c", + "copied_sha256": "b94b07830f6a35f4cfb1fa83c53fb47bca6546a2cb8c2420fe3c37371d98589c", + "bytes": 18384, + "modification": null + }, + { + "path": "resource/soil/草土地.png", + "source_sha256": "7c88025b4018a1899acb519f51540100b8f8983a573c1698f5cc0556be6f6003", + "copied_sha256": "7c88025b4018a1899acb519f51540100b8f8983a573c1698f5cc0556be6f6003", + "bytes": 33538, + "modification": null + }, + { + "path": "resource/soil/蓝晶土地-施肥.png", + "source_sha256": "3b3f658da052010aa9669440393aa9a27cc0d3d74a7fa6d2c1eba8e489773bb4", + "copied_sha256": "3b3f658da052010aa9669440393aa9a27cc0d3d74a7fa6d2c1eba8e489773bb4", + "bytes": 23409, + "modification": null + }, + { + "path": "resource/soil/蓝晶土地-缺水.png", + "source_sha256": "b9faa5cbd1f6e597c256d958c43102079915aea4a767265be9924f1b7b6e42c9", + "copied_sha256": "b9faa5cbd1f6e597c256d958c43102079915aea4a767265be9924f1b7b6e42c9", + "bytes": 24527, + "modification": null + }, + { + "path": "resource/soil/蓝晶土地.png", + "source_sha256": "6c979ecaaf8dd3f6dd36f020ac093a27fb3da379e90c0a7415848f4f15adf173", + "copied_sha256": "6c979ecaaf8dd3f6dd36f020ac093a27fb3da379e90c0a7415848f4f15adf173", + "bytes": 24026, + "modification": null + }, + { + "path": "resource/soil/金土地-施肥.png", + "source_sha256": "702cead6437b6daaf6f0a1e21a043c10a144f656280ffd904edf3e8278c87d59", + "copied_sha256": "702cead6437b6daaf6f0a1e21a043c10a144f656280ffd904edf3e8278c87d59", + "bytes": 22270, + "modification": null + }, + { + "path": "resource/soil/金土地-缺水.png", + "source_sha256": "f01a04953ee58d5c1eb90ebb1fd55719185c7f491bb80b586259b17ac25b70cb", + "copied_sha256": "f01a04953ee58d5c1eb90ebb1fd55719185c7f491bb80b586259b17ac25b70cb", + "bytes": 23931, + "modification": null + }, + { + "path": "resource/soil/金土地.png", + "source_sha256": "7d255b69bf1eb4af80df9551f744adf8bd80503c30f50273d7c0e4aeb7539e7b", + "copied_sha256": "7d255b69bf1eb4af80df9551f744adf8bd80503c30f50273d7c0e4aeb7539e7b", + "bytes": 22205, + "modification": null + }, + { + "path": "resource/soil/黑土地-施肥.png", + "source_sha256": "1e444de6abf8338ceb26b2f5c059206f1f3644bd226e2d173b78014d197e7a20", + "copied_sha256": "1e444de6abf8338ceb26b2f5c059206f1f3644bd226e2d173b78014d197e7a20", + "bytes": 16137, + "modification": null + }, + { + "path": "resource/soil/黑土地-缺水.png", + "source_sha256": "ee5bb8cf1c5b8bf71afad67de738ea7ca0fe0dd4ecbcb501a24a70dc14e1e714", + "copied_sha256": "ee5bb8cf1c5b8bf71afad67de738ea7ca0fe0dd4ecbcb501a24a70dc14e1e714", + "bytes": 19307, + "modification": null + }, + { + "path": "resource/soil/黑土地.png", + "source_sha256": "60df2513883acef72efe8b8fbfe1e15a04f0e601d0f352120a6bd56901f44767", + "copied_sha256": "60df2513883acef72efe8b8fbfe1e15a04f0e601d0f352120a6bd56901f44767", + "bytes": 16942, + "modification": null + }, + { + "path": "utils/__init__.py", + "source_sha256": "e6d459c58a87c921f0f006303033f380dd0e383b1bdad55d8d48f707e61f7639", + "copied_sha256": "e6d459c58a87c921f0f006303033f380dd0e383b1bdad55d8d48f707e61f7639", + "bytes": 610, + "modification": null + }, + { + "path": "utils/config.py", + "source_sha256": "7db2ecea67fc2db750deeab56ab760fbb5b1039019db829abf863f7bfd9d3d14", + "copied_sha256": "7db2ecea67fc2db750deeab56ab760fbb5b1039019db829abf863f7bfd9d3d14", + "bytes": 6645, + "modification": null + }, + { + "path": "utils/darw/__init__.py", + "source_sha256": "cb018709a85b3d3da9e80bf8d2b2efb394f707b2ff551f514f16dc96227e5d4a", + "copied_sha256": "cb018709a85b3d3da9e80bf8d2b2efb394f707b2ff551f514f16dc96227e5d4a", + "bytes": 60, + "modification": null + }, + { + "path": "utils/darw/drawFarm.py", + "source_sha256": "ae7cbc0e47f4690e68bbd0b406e9c0e200da44d4d5cdb1b8693c9bec091da257", + "copied_sha256": "ae7cbc0e47f4690e68bbd0b406e9c0e200da44d4d5cdb1b8693c9bec091da257", + "bytes": 16696, + "modification": null + }, + { + "path": "utils/json.py", + "source_sha256": "1e4acc8f9ecea5e8dad08821ae5113627786a06d34abb1a6676d52613d51e63d", + "copied_sha256": "1e4acc8f9ecea5e8dad08821ae5113627786a06d34abb1a6676d52613d51e63d", + "bytes": 4565, + "modification": null + }, + { + "path": "utils/request.py", + "source_sha256": "880ca1e47d0fa97367ca330c3fb7ba39f041a9acd716e2eaec7dd36113a66b10", + "copied_sha256": "7c29d6921c7b589cc4f1eac84647c6de1308bb799d2c9bb12146a083b69a77fa", + "bytes": 10242, + "modification": "Replaced hardcoded service token with FARM_SERVICE_TOKEN environment variable; no token copied." + }, + { + "path": "utils/tool.py", + "source_sha256": "8887834922b64f2fadc26cbcb5c0937dc76d133384f9624e338250b54cd3a802", + "copied_sha256": "8887834922b64f2fadc26cbcb5c0937dc76d133384f9624e338250b54cd3a802", + "bytes": 7962, + "modification": null + }, + { + "path": "utils/utils.py", + "source_sha256": "a58ae957d8c5f6d236add7a136d0a70dd0c9c7a569782ecccb59892e7bf7b6db", + "copied_sha256": "a58ae957d8c5f6d236add7a136d0a70dd0c9c7a569782ecccb59892e7bf7b6db", + "bytes": 523, + "modification": null + } + ] +} diff --git a/docs/progress.md b/docs/progress.md new file mode 100644 index 0000000..85028aa --- /dev/null +++ b/docs/progress.md @@ -0,0 +1,20 @@ +# 执行记录 + +## 2026-10-15 + +1. 定位空 farm 目录,核对旧项目分支与源提交。 +2. 选择 docs 作为唯一计划位置,初始化 Git main。 +3. 读取规划与审查要求,代码图查询后对关键问题核对源码。 +4. 复制 827 个受版本管理文件与许可证,保留旧项目。 +5. 复制前移除硬编码令牌,记录唯一源码差异与逐文件 SHA-256。 +6. 测量压缩体积,执行语法、静态数据库与隔离模块检查。 +7. 根据用户补充记录三个发布仓库地址并完成 clone; + 收到停止后不再远程操作,收到删除要求后验证精确路径并删除三个副本。 +8. 完成架构、业务、发布、迁移、审查、决策与验证文档。 +9. 建立 Python/农场忽略规则、跨平台换行策略、职责目录和离线校验工具。 +10. 离线校验通过:827 哈希、35 Python、4 JSON、两静态库。 +11. 29 类忽略规则符合预期;所有基线文件可被跟踪;源哈希未变化。 +12. 新工具无超长行;发布检出目录已不存在,无 .gitmodules。 +13. 文档链接、差异和工具错误路径在最后交付核对中记录到验证结果。 + +未实现新业务、未提交或推送、未配置远程发布权限。 diff --git a/docs/repository-checks.json b/docs/repository-checks.json new file mode 100644 index 0000000..ee3559f --- /dev/null +++ b/docs/repository-checks.json @@ -0,0 +1,19 @@ +{ + "git_branch": "main", + "git_remote": "", + "ignore_cases": 29, + "ignore_errors": [], + "ignored_baseline_files": [], + "broken_local_links": [], + "new_python_overlong_lines": [], + "source_hash_drift": [], + "local_release_workspace_exists": false, + "gitmodules_exists": false, + "helper_negative_checks": { + "hash_mismatch_detected": 827, + "destination_traversal_rejected": true + }, + "legacy_text_attribute": "legacy/zhenxun_plugin_farm/command.py: text: unset", + "untracked_candidate_files": 858, + "embedded_git_directories": [] +} diff --git a/docs/repository-inventory.json b/docs/repository-inventory.json new file mode 100644 index 0000000..8cc2778 --- /dev/null +++ b/docs/repository-inventory.json @@ -0,0 +1,93 @@ +{ + "checked_on": "2026-10-15", + "repositories": [ + { + "name": "zhenxun_plugin_farm", + "url": "https://github.com/Shu-Ying/zhenxun_plugin_farm.git", + "local_path": ".release-workspaces/zhenxun_plugin_farm", + "branch": "main", + "commit": "ac495ad6e94f414f5a642a0429f51e7affad3b2a", + "remote_head": "origin/main", + "status": "", + "tracked_files": 720, + "root_entries": [ + ".gitignore", + "LICENSE", + "README.md", + "__init__.py", + "command.py", + "config", + "config.py", + "database", + "dbService.py", + "event", + "farm", + "json.py", + "log", + "request.py", + "resource", + "tool.py" + ], + "nested_agent_rules": [], + "local_exists": false, + "observation": "historical metadata collected before user requested deletion" + }, + { + "name": "astrbot_plugin_farm", + "url": "https://github.com/Shu-Ying/astrbot_plugin_farm.git", + "local_path": ".release-workspaces/astrbot_plugin_farm", + "branch": "main", + "commit": "1f47aa84611e23a8f0814b9a9d236386a7bf4e13", + "remote_head": "origin/main", + "status": "", + "tracked_files": 727, + "root_entries": [ + ".gitignore", + "LICENSE", + "README.md", + "_conf_schema.json", + "cfg.py", + "config", + "database", + "dbService.py", + "event", + "farm", + "json.py", + "log", + "main.py", + "metadata.yaml", + "request.py", + "requirements.txt", + "resource", + "tool.py", + "zhenxun_utils" + ], + "nested_agent_rules": [], + "local_exists": false, + "observation": "historical metadata collected before user requested deletion" + }, + { + "name": "nonebot_plugin_farm", + "url": "https://github.com/Shu-Ying/nonebot_plugin_farm.git", + "local_path": ".release-workspaces/nonebot_plugin_farm", + "branch": "main", + "commit": "4fe60a6bde22375a7f81d2ed60aebfdb4f5fe93f", + "remote_head": "origin/main", + "status": "", + "tracked_files": 720, + "root_entries": [ + ".github", + ".gitignore", + "LICENSE", + "README.md", + "nonebot_plugin_farm", + "pyproject.toml" + ], + "nested_agent_rules": [], + "local_exists": false, + "observation": "historical metadata collected before user requested deletion" + } + ], + "current_local_state": "deleted-at-user-request", + "network_actions_allowed": false +} diff --git a/docs/task_plan.md b/docs/task_plan.md new file mode 100644 index 0000000..d3fc2be --- /dev/null +++ b/docs/task_plan.md @@ -0,0 +1,47 @@ +# Farm 主仓库初始化计划 + +日期:2026-10-15。负责人:当前主 Agent。 + +## 目标与状态 + +本轮初始化与设计交付已完成。业务重构尚未开始,正式产品决策仍待确认。 +建立一个开发主仓库、多框架发布仓库的长期方案;保留旧插件源码与资源; +完成 Git、忽略规则、设计和源码审查文档。 + +## 完成阶段 + +- [x] 定位 D:/Work/farm;原为空目录。 +- [x] 初始化本地 Git,main 分支;未设远程,未提交或推送。 +- [x] 复制 827 个旧文件,生成来源清单;副本移除硬编码凭据。 +- [x] 完成架构、目录、业务逻辑、发布与迁移规划。 +- [x] 完成源码审查、待确认项与风险说明。 +- [x] 验证哈希、Python/JSON 语法、静态库和忽略规则。 +- [x] 按补充要求记录三个发布仓库地址。 +- [x] 用户撤回拉取并要求删除后,删除三个已克隆副本,停止远程访问。 +- [x] 本地文档索引与校验结果交付。 + +## 不属于本轮的工作 + +真实多框架业务实现、自动发布、远程提交、发布仓库接管、真实用户数据 +迁移和服务端令牌轮换,分别按路线和授权推进,不计为本轮已完成实现。 + +## 约束 + +- 旧项目 D:/Work/zhenxun_plugin_farm 保持不变。 +- 基线:Beta,b015c6c1997f146f651b677382980d338a306bb2。 +- 真实玩家数据、凭据、运行时缓存和 Git 元数据不复制进主源码。 +- 文档区分事实、设计建议、待确认项与已完成修改。 +- 三个发布仓库仅记录地址,不再 clone/fetch/pull/push。 + +## 执行异常与处理 + +| 情况 | 处理 | +|---|---| +| 默认命令环境曾有 MXC 启动错误 | 使用针对用户授权目录的提升执行 | +| 规划解析脚本被签名策略拒绝 | 不改系统策略,显式固定 docs 规划位置 | +| 空目录尚非 Git 仓库,diff 失败 | 初始化后验证 | +| 文档首次检查时 08-validation.md 尚未创建 | 创建后重新检查链接 | +| 旧活动模块 NameError | 记录为已确认缺陷,不混为本轮失败 | +| 用户要求停止拉取时三个 clone 已完成 | 如实说明,收到删除要求后逐个校验路径并删除 | + +没有尝试绕过用户停止拉取要求,也没有执行远程发布。 diff --git a/integrations/astrbot/README.md b/integrations/astrbot/README.md new file mode 100644 index 0000000..c3e8712 --- /dev/null +++ b/integrations/astrbot/README.md @@ -0,0 +1,7 @@ +# AstrBot 接入预留位置 + +发布目标:https://github.com/Shu-Ying/astrbot_plugin_farm.git +负责 AstrBot 事件、消息、配置和生命周期,不导入 NoneBot 或真寻。 +未来生成 main.py、metadata.yaml、配置描述、依赖和私有核心。 +本目录尚不可安装;必须验证资源体积及实际安装。 +远程仓库本轮不再拉取或推送。 diff --git a/integrations/nonebot/README.md b/integrations/nonebot/README.md new file mode 100644 index 0000000..bc7a843 --- /dev/null +++ b/integrations/nonebot/README.md @@ -0,0 +1,6 @@ +# 普通 NoneBot 接入预留位置 + +发布目标:https://github.com/Shu-Ying/nonebot_plugin_farm.git +负责 NoneBot 命令、会话、消息、配置与启停,不导入真寻。 +发布仓库保留 Python 包构建布局;PyPI 发布流程待实施。 +本目录尚不可安装。远程仓库本轮不再拉取或推送。 diff --git a/integrations/zhenxun/README.md b/integrations/zhenxun/README.md new file mode 100644 index 0000000..7978cd6 --- /dev/null +++ b/integrations/zhenxun/README.md @@ -0,0 +1,6 @@ +# 真寻接入预留位置 + +发布目标:https://github.com/Shu-Ying/zhenxun_plugin_farm.git +负责命令、配置、真寻金币、数据目录、权限和生命周期。 +共享核心通过插件私有路径加载。旧真寻入口仍在 legacy 中, +本目录尚不可安装。远程仓库本轮不再拉取或推送。 diff --git a/legacy/zhenxun_plugin_farm/LICENSE b/legacy/zhenxun_plugin_farm/LICENSE new file mode 100644 index 0000000..871ce8e --- /dev/null +++ b/legacy/zhenxun_plugin_farm/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/legacy/zhenxun_plugin_farm/README.md b/legacy/zhenxun_plugin_farm/README.md new file mode 100644 index 0000000..b12d15f --- /dev/null +++ b/legacy/zhenxun_plugin_farm/README.md @@ -0,0 +1,134 @@ +
+ +# 真寻农场(zhenxun_plugin_farm) +

+ + license + + + Python + + + ruff + + + Nonebot + + + Python + +

+ +

+ +[![tencent-qq](https://img.shields.io/badge/%E7%BE%A4-%E7%9C%9F%E5%AF%BB%E5%86%9C%E5%9C%BA%E6%B5%8B%E8%AF%95-%23FF99CC +)](https://qm.qq.com/q/7hsOD4rOw2) + +

+ +你是说可以种地对吧🤔? + +
+ +--- +## 目录 +- [真寻农场(zhenxun\_plugin\_farm)](#真寻农场zhenxun_plugin_farm) + - [目录](#目录) + - [农场界面](#农场界面) + - [如何安装](#如何安装) + - [使用指令](#使用指令) + - [更新日志(详细):](#更新日志详细) + - [用户方面](#用户方面) + - [代码方面](#代码方面) + - [待办事宜 `Todo` 列表](#待办事宜-todo-列表) + - [关于](#关于) + - [致谢](#致谢) + - [许可证](#许可证) + +--- + +## 农场界面 + +![农场界面](./resource/1.png) + +--- + +## 如何安装 + +方法一(推荐):在小真寻后台的插件商店下载即可
+方法二:下载源码放在小真寻`plugin`目录下 + +--- + +## 使用指令 + +| 指令 | 描述 | Tip | +| --- | --- | --- | +| @小真寻 开通农场 | 首次开通农场 | | +| 我的农场 | 你的农场 | | +| 农场详述 | 农场详细信息 | | +| 我的农场币 | 查询农场币 | | +| 种子商店 [筛选关键字] [页数] or [页数] | 查看种子商店 | 当第一个参数为非整数时,会默认进入筛选状态。页数不填默认为1 | +| 购买种子 [种子名称] [数量] | 购买种子 | 数量不填默认为1 | +| 我的种子 | 查询仓库种子 | | +| 播种 [种子名称] [数量] | 播种种子 | 数量不填默认将最大可能播种 | +| 收获 | 收获成熟作物 | | +| 铲除 | 铲除荒废作物 | | +| 我的作物 | 你的作物 | | +| 出售作物 [作物名称] [数量] | 从仓库里向系统售卖作物 | 不填写作物名将售卖仓库种全部作物 填作物名不填数量将指定作物全部出售 | +| 偷菜 @美波理 | 偷别人的菜 | 每人每天只能偷5次 | +| 购买农场币 | 将真寻金币兑换成农场币 | 兑换比例默认为1:2 手续费默认20% | +| 更改农场名 [新的农场名] | 改名 | 农场名称无法存储特殊字符 | +| 农场签到 | 签到 | 需要注意,该项会从服务器拉取签到数据 | +| 土地升级 [地块ID] | 将土地升级,带来收益提升 | 如果土地升级时,土地有播种作物,那么将直接成熟 | + +--- + +## 更新日志[(详细)](./log/log.md): +用户方面 +--- +- 新增土地升级指令,快来将土地升级至红土地、黑土地、金土地吧 +- 新增查漏补缺作物资源功能,自动更新最新作物和作物资源文件 +- 定时更新签到文件、作物资源从00:30调整至04:30 +- 修正了部分土地资源错误的情况 +- 修正了部分文本信息错误的情况 + +代码方面 +--- +- 修正部分事件连接机制 +- 修正网络请求端口 + +## 待办事宜 `Todo` 列表 + +- [x] 完善我的农场图片,例如左上角显示用户数据 +- [ ] 完善升级数据、作物数据、作物图片 +- [x] 签到功能 +- [x] 在线更新作物信息 +- [ ] 添加渔场功能 +- [ ] 增加活动、交易行功能 +- [ ] 增加交易行总行功能 +- [ ] 添加其他游戏种子素材 +- [ ] 想不到了,想到再说 + +--- + +## 关于 + +本人毫无任何Python经验,也从未正式的、系统的、完整的去学习Python。如有看到写的不对的地方,欢迎指出,也欢迎任何人一起来开发、完善农场。 + +素材来均源于互联网,侵权请联系我删除 + +--- + +## 致谢 + +最后感谢以下框架/作者的提供的技术支持(排名不分先后): + +- [Nonebot2](https://github.com/nonebot/nonebot2) *✨ 跨平台 Python 异步机器人框架 ✨* +- [zhenxun_bot](https://github.com/zhenxun-org/zhenxun_bot) *最爱真寻的一集* +- [HibiKier](https://github.com/HibiKier) *阿咪为什么是神* +- [ATTomato](https://github.com/ATTomatoo) *流泪偷码头.jpg* + +## 许可证 + +`真寻农场(zhenxun_plugin_farm)`将采用的是`GPLv3`许可证进行开源 diff --git a/legacy/zhenxun_plugin_farm/__init__.py b/legacy/zhenxun_plugin_farm/__init__.py new file mode 100644 index 0000000..ddc9cba --- /dev/null +++ b/legacy/zhenxun_plugin_farm/__init__.py @@ -0,0 +1,155 @@ +from nonebot import get_driver +from nonebot.plugin import PluginMetadata +from nonebot_plugin_apscheduler import scheduler + +from zhenxun.configs.utils import Command, PluginExtraData, RegisterConfig +from zhenxun.services.log import logger +from zhenxun.utils.message import MessageUtils + +from .command import diuse_farm, diuse_register, reclamation +from .core import ( + CHelpManager, + CShopManager, + g_pDBlocator, + g_pSqlManager, + g_pUserPool, + getFarmManager, + getSignInManager, +) +from .core.dbService import g_pDBService +from .event import g_pEventManager +from .utils import config, getJsonManager, getRequestManager + +__plugin_meta__ = PluginMetadata( + name="真寻农场", + description="快乐的农场时光", + usage=""" + 你也要种地? + 指令: + at 开通农场 + 我的农场 + 农场详述 + 我的农场币 + 种子商店 [筛选关键字] [页数] or [页数] + 购买种子 [作物/种子名称] [数量] + 我的种子 + 播种 [作物/种子名称] [数量] (数量不填默认将最大可能播种 + 收获 + 铲除 + 我的作物 + 出售作物 [作物/种子名称] [数量] (不填写作物名将售卖仓库种全部作物 填作物名不填数量将指定作物全部出售 + 偷菜 at (每人每天只能偷5次 + 开垦 + 购买农场币 [数量] 数量为消耗金币的数量 + 更改农场名 [新农场名] + 农场签到 + 土地升级 [地块ID](通过农场详述获取) + """.strip(), + extra=PluginExtraData( + author="Art_Sakura", + version="1.5.2", + commands=[Command(command="我的农场")], + menu_type="群内小游戏", + configs=[ + RegisterConfig( + key="绘制农场清晰度", + value="low", + help="我的农场返回图片的清晰度, [low, medium, hight, original]", + default_value="low", + ), + RegisterConfig( + key="动态背景", + value=True, + help="是否开启根据季节和节日变化的动态背景", + type=bool, + default_value=True, + ), + RegisterConfig( + key="签到图片样式", + value="text", + help="签到图片的样式, [text, html]", + default_value="text", + ), + RegisterConfig( + key="兑换倍数", + value="2", + help="金币兑换农场币的倍数 默认值为: 2倍", + default_value="2", + ), + RegisterConfig( + key="点券兑换倍数", + value="2000", + help="农场币兑换点券的倍数 比例为2000:1", + default_value="2000", + ), + RegisterConfig( + key="手续费", + value="0.2", + help="金币兑换农场币的手续费 默认值为: 0.2 实际意义为20%手续费", + default_value="0.2", + ), + RegisterConfig( + key="服务地址", + value="http://diuse.work", + help="签到、交易行、活动等服务器地址", + default_value="http://diuse.work", + ), + ], + ).to_dict(), +) +driver = get_driver() + + +# 构造函数 +@driver.on_startup +async def start(): + # 数据库加载 + await g_pSqlManager.init() + + # 初始化数据库变量 和 加载作物数据库 + await g_pDBService.init() + + # 检查作物文件是否缺失 or 更新 + await getRequestManager().initPlantDBFile() + + await CHelpManager.createHelpImage() + + # todayRewards = [ + # { + # "imagePath": "../plant/ATTomato/icon.png", + # "name": "金币", + # "quantity": 100, + # }, + # ] + + # logger.info(f"{todayRewards[0]}") + + # cumulativeRewards = [ + # { + # "imagePath": g_sResourcePath / "/plant/ATTomato/icon.png", + # "name": "金币", + # "quantity": 200, + # "description": "累计签到1次", + # "achieved": True, + # }, + # ] + + # await g_pSignInManager.createSignImage(todayRewards, cumulativeRewards, 1, 1, 1) + + +# 析构函数 +@driver.on_shutdown +async def shutdown(): + # 单独卸载 作物数据库 + await g_pDBService.cleanup() + + await g_pSqlManager.cleanup() + + +@scheduler.scheduled_job(trigger="cron", hour=4, minute=30, id="signInFile") +async def signInFile(): + try: + await getJsonManager().initSignInFile() + await getRequestManager().initPlantDBFile() + except Exception as e: + logger.error("农场定时检查出错", e=e) diff --git a/legacy/zhenxun_plugin_farm/command.py b/legacy/zhenxun_plugin_farm/command.py new file mode 100644 index 0000000..488e8f4 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/command.py @@ -0,0 +1,737 @@ +import inspect + +from nonebot.adapters import Event +from nonebot.rule import to_me +from nonebot_plugin_alconna import ( + Alconna, + AlconnaQuery, + Args, + At, + Match, + MultiVar, + Option, + Query, + Subcommand, + on_alconna, + store_true, +) +from nonebot_plugin_uninfo import Uninfo +from nonebot_plugin_waiter import waiter + +from zhenxun.configs.config import BotConfig +from zhenxun.configs.path_config import DATA_PATH +from zhenxun.services.log import logger +from zhenxun.utils._build_image import BuildImage +from zhenxun.utils.message import MessageUtils + +from .core import CShopManager, g_pDBlocator, getFarmManager, getSignInManager +from .utils import config, getDrawFarm, getToolManager + +diuse_register = on_alconna( + Alconna("开通农场"), + priority=5, + rule=to_me(), + block=True, + use_cmd_start=True, +) + + +@diuse_register.handle() +async def handle_register(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is not None and await player.isRegistered(): + await MessageUtils.build_message( + config.g_sTranslation["register"]["repeat"] + ).send(reply_to=True) + return + + try: + raw_name = str(session.user.name) + safe_name = getToolManager().sanitize_username(raw_name) + + success = await g_pDBlocator.getUserManager().initUserInfo(uid, safe_name) + + logger.info(f"用户 {uid} 选择的农场名称为: {raw_name} | 过滤后为: {safe_name}") + + msg = ( + config.g_sTranslation["register"]["success"].format(point=500) + if success + else config.g_sTranslation["register"]["error"] + ) + logger.info(f"用户注册 {'成功' if success else '失败'}:{uid}") + + except Exception as e: + msg = config.g_sTranslation["register"]["error"] + logger.error(f"注册异常 | UID:{uid} | 错误:{e}") + + await MessageUtils.build_message(msg).send(reply_to=True) + + +diuse_farm = on_alconna( + Alconna( + "我的农场", + Option("--all", action=store_true), + Subcommand("detail", help_text="农场详述"), + Subcommand("my-point", help_text="我的农场币"), + Subcommand("seed-shop", Args["res?", MultiVar(str)], help_text="种子商店"), + Subcommand("buy-seed", Args["name?", str]["num?", int], help_text="购买种子"), + Subcommand("my-seed", help_text="我的种子"), + Subcommand("sowing", Args["name?", str]["num?", int], help_text="播种"), + Subcommand("harvest", help_text="收获"), + Subcommand("eradicate", help_text="铲除"), + Subcommand("my-plant", help_text="我的作物"), + Subcommand("lock-plant", Args["name?", str], help_text="作物加锁"), + Subcommand("unlock-plant", Args["name?", str], help_text="作物解锁"), + Subcommand("sell-plant", Args["name?", str]["num?", int], help_text="出售作物"), + Subcommand("stealing", Args["target?", At], help_text="偷菜"), + Subcommand("buy-point", Args["num?", int], help_text="购买农场币"), + # Subcommand("sell-point", Args["num?", int], help_text="转换金币") + Subcommand("change-name", Args["name?", str], help_text="更改农场名"), + Subcommand("sign-in", help_text="农场签到"), + Subcommand("admin-up", Args["num?", int], help_text="农场下阶段"), + Subcommand("point-to-vipPoint", Args["num?", int], help_text="点券兑换"), + Subcommand("my-vipPoint", help_text="我的点券"), + Subcommand("farm-help", help_text="农场帮助"), + Subcommand("vipSeed-shop", Args["res?", MultiVar(str)], help_text="种子商店"), + ), + priority=5, + block=True, + use_cmd_start=True, +) + + +@diuse_farm.assign("$main") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + image = await getDrawFarm().drawFarmByUid(uid) + await MessageUtils.build_message(image).send(reply_to=True) + + +diuse_farm.shortcut( + "农场详述", + command="我的农场", + arguments=["detail"], + prefix=True, +) + + +@diuse_farm.assign("detail") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + info = await getDrawFarm().drawDetailFarmByUid(uid) + + await MessageUtils.alc_forward_msg( + [info], session.self_id, BotConfig.self_nickname + ).send() + + +diuse_farm.shortcut( + "我的农场币", + command="我的农场", + arguments=["my-point"], + prefix=True, +) + + +@diuse_farm.assign("my-point") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + point = player.user["point"] + + if point < 0: + await MessageUtils.build_message( + config.g_sTranslation["basic"]["notFarm"] + ).send() + return False + + await MessageUtils.build_message( + config.g_sTranslation["basic"]["point"].format(point=point) + ).send(reply_to=True) + + +diuse_farm.shortcut( + "种子商店(.*?)", + command="我的农场", + arguments=["seed-shop"], + prefix=True, +) + + +@diuse_farm.assign("seed-shop") +async def _(session: Uninfo, res: Match[tuple[str, ...]]): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + if res.result is inspect._empty: + raw = [] + else: + raw = res.result + + filterKey: str | int | None = None + page: int = 1 + + if len(raw) >= 1 and raw[0] is not None: + first = raw[0] + if isinstance(first, str) and first.isdigit(): + page = int(first) + else: + filterKey = first + + if ( + len(raw) >= 2 + and raw[1] is not None + and isinstance(raw[1], str) + and raw[1].isdigit() + ): + page = int(raw[1]) + + if filterKey is None: + image = await CShopManager.getSeedShopImage(page, 0, 0) + else: + image = await CShopManager.getSeedShopImage(filterKey, page, 0) + + await MessageUtils.build_message(image).send() + + +diuse_farm.shortcut( + "购买种子(?P.*?)", + command="我的农场", + arguments=["buy-seed", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("buy-seed") +async def _( + session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", 1) +): + if not name.available: + await MessageUtils.build_message( + config.g_sTranslation["buySeed"]["notSeed"] + ).finish(reply_to=True) + + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await CShopManager.buySeed(uid, name.result, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "我的种子", + command="我的农场", + arguments=["my-seed"], + prefix=True, +) + + +@diuse_farm.assign("my-seed") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().getUserSeedByUid(uid) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "播种(?P.*?)", + command="我的农场", + arguments=["sowing", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("sowing") +async def _( + session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", -1) +): + if not name.available: + await MessageUtils.build_message( + config.g_sTranslation["sowing"]["notSeed"] + ).finish(reply_to=True) + + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().sowing(uid, name.result, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "收获", + command="我的农场", + arguments=["harvest"], + prefix=True, +) + + +@diuse_farm.assign("harvest") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().harvest(uid) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "铲除", + command="我的农场", + arguments=["eradicate"], + prefix=True, +) + + +@diuse_farm.assign("eradicate") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().eradicate(uid) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "我的作物", + command="我的农场", + arguments=["my-plant"], + prefix=True, +) + + +@diuse_farm.assign("my-plant") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().getUserPlantByUid(uid) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "作物加锁(?P)", + command="我的农场", + arguments=["lock-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("lock-plant") +async def _(session: Uninfo, name: Match[str]): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().lockUserPlantByUid(uid, name.result, 1) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "作物解锁(?P)", + command="我的农场", + arguments=["unlock-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("unlock-plant") +async def _(session: Uninfo, name: Match[str]): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().lockUserPlantByUid(uid, name.result, 0) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "出售作物(?P.*?)", + command="我的农场", + arguments=["sell-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("sell-plant") +async def _( + session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", -1) +): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await CShopManager.sellPlantByUid(uid, name.result, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +reclamation = on_alconna( + Alconna("开垦"), + priority=5, + block=True, + use_cmd_start=True, +) + + +@reclamation.handle() +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + condition = await getFarmManager().reclamationCondition(uid) + condition += f"\n{config.g_sTranslation['reclamation']['confirm']}" + await MessageUtils.build_message(condition).send(reply_to=True) + + @waiter(waits=["message"], keep_session=True) + async def check(event: Event): + return event.get_plaintext() + + resp = await check.wait(timeout=60) + if resp is None: + await MessageUtils.build_message( + config.g_sTranslation["reclamation"]["timeOut"] + ).send(reply_to=True) + return + if not resp == "是": + return + + res = await getFarmManager().reclamation(uid) + await MessageUtils.build_message(res).send(reply_to=True) + + +diuse_farm.shortcut( + "偷菜", + command="我的农场", + arguments=["stealing"], + prefix=True, +) + + +@diuse_farm.assign("stealing") +async def _(session: Uninfo, target: Match[At]): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + if not target.available: + await MessageUtils.build_message( + config.g_sTranslation["stealing"]["noTarget"] + ).finish(reply_to=True) + + tar = target.result + result = await g_pDBlocator.getUserManager().isRegistered(tar.target) + + if not result: + await MessageUtils.build_message( + config.g_sTranslation["stealing"]["targetNotFarm"] + ).send() + return None + + result = await getFarmManager().stealing(uid, tar.target) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "购买农场币(.*?)", + command="我的农场", + arguments=["buy-point"], + prefix=True, +) + + +@diuse_farm.assign("buy-point") +async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): + if num.result <= 0: + await MessageUtils.build_message("请在指令后跟需要购买农场币的数量").finish( + reply_to=True + ) + + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().buyPointByUid(uid, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "更改农场名(?P)", + command="我的农场", + arguments=["change-name", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("change-name") +async def _(session: Uninfo, name: Match[str]): + if not name.available: + await MessageUtils.build_message( + config.g_sTranslation["changeName"]["noName"] + ).finish(reply_to=True) + + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + player = await getToolManager().getPlayerByUid(uid) + if player is None: + await MessageUtils.build_message( + config.g_sTranslation["changeName"]["error1"] + ).send(reply_to=True) + return + + result = await player.updateName(name.result) + await MessageUtils.build_message(config.g_sTranslation["changeName"][result]).send( + reply_to=True + ) + + +diuse_farm.shortcut( + "农场签到", + command="我的农场", + arguments=["sign-in"], + prefix=True, +) + + +@diuse_farm.assign("sign-in") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + # 判断签到是否正常加载 + if not config.g_bSignStatus: + await MessageUtils.build_message( + config.g_sTranslation["signIn"]["error"] + ).send() + return + + message = await getSignInManager().signInByUid(uid) + await MessageUtils.build_message(message).send() + + +soil_upgrade = on_alconna( + Alconna("土地升级", Args["index", int]), + priority=5, + block=True, + use_cmd_start=True, +) + + +@soil_upgrade.handle() +async def _(session: Uninfo, index: Query[int] = AlconnaQuery("index", 1)): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + condition = await getFarmManager().soilUpgradeCondition(uid, index.result) + + await MessageUtils.build_message(condition).send(reply_to=True) + + if not condition.startswith("将土地升级至:"): + return + + @waiter(waits=["message"], keep_session=True) + async def check(event: Event): + return event.get_plaintext() + + resp = await check.wait(timeout=60) + if resp is None: + await MessageUtils.build_message( + config.g_sTranslation["soilInfo"]["timeOut"] + ).send(reply_to=True) + return + if not resp == "是": + return + + res = await getFarmManager().soilUpgrade(uid, index.result) + await MessageUtils.build_message(res).send(reply_to=True) + + +diuse_farm.shortcut( + "农场下阶段(.*?)", + command="我的农场", + arguments=["admin-up"], + prefix=True, +) + + +@diuse_farm.assign("admin-up") +async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + await g_pDBlocator.getUserSoilManager().nextPhase(uid, num.result) + + +diuse_farm.shortcut( + "点券兑换(.*?)", + command="我的农场", + arguments=["point-to-vipPoint"], + prefix=True, +) + + +@diuse_farm.assign("point-to-vipPoint") +async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): + if num.result <= 0: + await MessageUtils.build_message("请在指令后跟需要购买点券的数量").finish( + reply_to=True + ) + + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + result = await getFarmManager().pointToVipPointByUid(uid, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "我的点券", + command="我的农场", + arguments=["my-vipPoint"], + prefix=True, +) + + +@diuse_farm.assign("my-vipPoint") +async def _(session: Uninfo): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + await MessageUtils.build_message( + config.g_sTranslation["basic"]["vipPoint"].format( + vipPoint=player.user["vipPoint"] + ) + ).send(reply_to=True) + + +diuse_farm.shortcut( + "农场帮助", + command="我的农场", + arguments=["farm-help"], + prefix=True, +) + + +@diuse_farm.assign("farm-help") +async def _(session: Uninfo): + savePath = DATA_PATH / "farm_res/html/help.png" + + image = BuildImage(background=savePath) + + await MessageUtils.build_message(image).send(reply_to=True) + + +diuse_farm.shortcut( + "点券商店(.*?)", + command="我的农场", + arguments=["vipSeed-shop"], + prefix=True, +) + + +@diuse_farm.assign("vipSeed-shop") +async def _(session: Uninfo, res: Match[tuple[str, ...]]): + uid = str(session.user.id) + player = await getToolManager().getPlayerByUid(uid) + if player is None or not await player.isRegistered(): + await getToolManager().repeat() + return + + if res.result is inspect._empty: + raw = [] + else: + raw = res.result + + filterKey: str | int | None = None + page: int = 1 + + if len(raw) >= 1 and raw[0] is not None: + first = raw[0] + if isinstance(first, str) and first.isdigit(): + page = int(first) + else: + filterKey = first + + if ( + len(raw) >= 2 + and raw[1] is not None + and isinstance(raw[1], str) + and raw[1].isdigit() + ): + page = int(raw[1]) + + if filterKey is None: + image = await CShopManager.getSeedShopImage(page, 0, 1) + else: + image = await CShopManager.getSeedShopImage(filterKey, page, 1) + + await MessageUtils.build_message(image).send() diff --git a/legacy/zhenxun_plugin_farm/config/item.json b/legacy/zhenxun_plugin_farm/config/item.json new file mode 100644 index 0000000..fbae379 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/config/item.json @@ -0,0 +1,22 @@ +{ + "version": 0.01, + "zhuShi": + [ + "name: 名称", + "level: 等级", + "price: 单价", + "icon: 显示图片", + "sell: 是否可以上架交易行" + ], + "item": + { + "muBan": + { + "name": "木板", + "level": 0, + "price": 5000, + "icon": "Test", + "sell": true + } + } +} diff --git a/legacy/zhenxun_plugin_farm/config/level.json b/legacy/zhenxun_plugin_farm/config/level.json new file mode 100644 index 0000000..82d8d34 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/config/level.json @@ -0,0 +1,172 @@ +{ + "version": 0.01, + "soil":[1, 1, 1, 2, 3, 5, 7, 9, 11, 13, + 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, + 36, 39, 42, 45, 48, 51, 54, 57, 60, 70 + ], + "reclamation": + { + "4": + { + "level": 2, + "point": 800, + "item": [] + }, + "5": + { + "level": 3, + "point": 1300, + "item": [] + }, + "6": + { + "level": 5, + "point": 3200, + "item": [] + }, + "7": + { + "level": 7, + "point": 5500, + "item": [] + }, + "8": + { + "level": 9, + "point": 12000, + "item": [] + }, + "9": + { + "level": 11, + "point": 19800, + "item": [] + }, + "10": + { + "level": 13, + "point": 30000, + "item": [] + }, + "11": + { + "level": 15, + "point": 50000, + "item": [] + }, + "12": + { + "level": 17, + "point": 70000, + "item": [] + }, + "13": + { + "level": 19, + "point": 90000, + "item": [] + }, + "14": + { + "level": 21, + "point": 130000, + "item": [] + }, + "15": + { + "level": 23, + "point": 150000, + "item": [] + }, + "16": + { + "level": 25, + "point": 180000, + "item": [] + }, + "17": + { + "level": 27, + "point": 230000, + "item": [] + }, + "18": + { + "level": 29, + "point": 300000, + "item": [] + }, + "19": + { + "level": 31, + "point": 500000, + "item": [] + }, + "20": + { + "level": 33, + "point": 850000, + "item": [] + }, + "21": + { + "level": 36, + "point": 1100000, + "item": [] + }, + "22": + { + "level": 39, + "point": 1300000, + "item": [] + }, + "23": + { + "level": 42, + "point": 1500000, + "item": [] + }, + "24": + { + "level": 45, + "point": 1700000, + "item": [] + }, + "25": + { + "level": 48, + "point": 2000000, + "item": [] + }, + "26": + { + "level": 51, + "point": 2200000, + "item": [] + }, + "27": + { + "level": 54, + "point": 2800000, + "item": [] + }, + "28": + { + "level": 57, + "point": 3500000, + "item": [] + }, + "29": + { + "level": 60, + "point": 4300000, + "item": [] + }, + "30": + { + "level": 70, + "point": 5200000, + "item": [] + } + } +} diff --git a/legacy/zhenxun_plugin_farm/config/soil.json b/legacy/zhenxun_plugin_farm/config/soil.json new file mode 100644 index 0000000..1ba0308 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/config/soil.json @@ -0,0 +1,256 @@ +{ + "version": 0.01, + "size":[234, 156], + "soil": + { + "1": + { + "x": 1352, + "y": 552 + }, + "2": + { + "x": 1462, + "y": 611 + }, + "3": + { + "x": 1572, + "y": 670 + }, + "4": + { + "x": 1682, + "y": 729 + }, + "5": + { + "x": 1792, + "y": 788 + }, + "6": + { + "x": 1902, + "y": 847 + }, + "7": + { + "x": 1237, + "y": 606 + }, + "8": + { + "x": 1350, + "y": 665 + }, + "9": + { + "x": 1457, + "y": 724 + }, + "10": + { + "x": 1567, + "y": 783 + }, + "11": + { + "x": 1677, + "y": 842 + }, + "12": + { + "x": 1787, + "y": 901 + }, + "13": + { + "x": 1116, + "y": 663 + }, + "14": + { + "x": 1226, + "y": 722 + }, + "15": + { + "x": 1336, + "y": 782 + }, + "16": + { + "x": 1455, + "y": 840 + }, + "17": + { + "x": 1565, + "y": 899 + }, + "18": + { + "x": 1671, + "y": 958 + }, + "19": + { + "x": 1002, + "y": 720 + }, + "20": + { + "x": 1105, + "y": 779 + }, + "21": + { + "x": 1224, + "y": 838 + }, + "22": + { + "x": 1343, + "y": 897 + }, + "23": + { + "x": 1449, + "y": 956 + }, + "24": + { + "x": 1563, + "y": 1015 + }, + "25": + { + "x": 883, + "y": 777 + }, + "26": + { + "x": 995, + "y": 836 + }, + "27": + { + "x": 1112, + "y": 895 + }, + "28": + { + "x": 1222, + "y": 954 + }, + "29": + { + "x": 1336, + "y": 1013 + }, + "30": + { + "x": 1451, + "y": 1072 + } + }, + "upgrade": + { + "red": [ + { "level": 28, "point": 200000, "vipPoint": 0, "item":{}}, + { "level": 29, "point": 220000, "vipPoint": 0, "item":{}}, + { "level": 30, "point": 240000, "vipPoint": 0, "item":{}}, + { "level": 31, "point": 260000, "vipPoint": 0, "item":{}}, + { "level": 32, "point": 290000, "vipPoint": 0, "item":{}}, + { "level": 33, "point": 320000, "vipPoint": 0, "item":{}}, + { "level": 34, "point": 350000, "vipPoint": 0, "item":{}}, + { "level": 35, "point": 380000, "vipPoint": 0, "item":{}}, + { "level": 36, "point": 410000, "vipPoint": 0, "item":{}}, + { "level": 37, "point": 440000, "vipPoint": 0, "item":{}}, + { "level": 38, "point": 480000, "vipPoint": 0, "item":{}}, + { "level": 39, "point": 520000, "vipPoint": 0, "item":{}}, + { "level": 40, "point": 560000, "vipPoint": 0, "item":{}}, + { "level": 41, "point": 600000, "vipPoint": 0, "item":{}}, + { "level": 42, "point": 650000, "vipPoint": 0, "item":{}}, + { "level": 43, "point": 700000, "vipPoint": 0, "item":{}}, + { "level": 44, "point": 770000, "vipPoint": 0, "item":{}}, + { "level": 45, "point": 900000, "vipPoint": 0, "item":{}}, + { "level": 47, "point": 1500000, "vipPoint": 0, "item":{}}, + { "level": 49, "point": 2000000, "vipPoint": 0, "item":{}}, + { "level": 53, "point": 4000000, "vipPoint": 0, "item":{}}, + { "level": 53, "point": 4000000, "vipPoint": 0, "item":{}}, + { "level": 55, "point": 5500000, "vipPoint": 0, "item":{}}, + { "level": 57, "point": 6800000, "vipPoint": 0, "item":{}}, + { "level": 60, "point": 10000000, "vipPoint": 0, "item":{}}, + { "level": 64, "point": 15000000, "vipPoint": 0, "item":{}}, + { "level": 68, "point": 20000000, "vipPoint": 0, "item":{}}, + { "level": 73, "point": 30000000, "vipPoint": 0, "item":{}}, + { "level": 78, "point": 50000000, "vipPoint": 0, "item":{}}, + { "level": 83, "point": 80000000, "vipPoint": 0, "item":{}} + ], + "black": [ + { "level": 40, "point": 500000, "vipPoint": 0, "item":{}}, + { "level": 41, "point": 600000, "vipPoint": 0, "item":{}}, + { "level": 42, "point": 700000, "vipPoint": 0, "item":{}}, + { "level": 43, "point": 800000, "vipPoint": 0, "item":{}}, + { "level": 44, "point": 900000, "vipPoint": 0, "item":{}}, + { "level": 45, "point": 1000000, "vipPoint": 0, "item":{}}, + { "level": 46, "point": 2000000, "vipPoint": 0, "item":{}}, + { "level": 47, "point": 2200000, "vipPoint": 0, "item":{}}, + { "level": 48, "point": 2400000, "vipPoint": 0, "item":{}}, + { "level": 49, "point": 2600000, "vipPoint": 0, "item":{}}, + { "level": 50, "point": 2800000, "vipPoint": 0, "item":{}}, + { "level": 51, "point": 3000000, "vipPoint": 0, "item":{}}, + { "level": 52, "point": 4000000, "vipPoint": 0, "item":{}}, + { "level": 53, "point": 4200000, "vipPoint": 0, "item":{}}, + { "level": 54, "point": 4400000, "vipPoint": 0, "item":{}}, + { "level": 55, "point": 4600000, "vipPoint": 0, "item":{}}, + { "level": 56, "point": 4800000, "vipPoint": 0, "item":{}}, + { "level": 57, "point": 5000000, "vipPoint": 0, "item":{}}, + { "level": 59, "point": 6000000, "vipPoint": 0, "item":{}}, + { "level": 61, "point": 6200000, "vipPoint": 0, "item":{}}, + { "level": 65, "point": 6600000, "vipPoint": 0, "item":{}}, + { "level": 65, "point": 6600000, "vipPoint": 0, "item":{}}, + { "level": 67, "point": 6800000, "vipPoint": 0, "item":{}}, + { "level": 69, "point": 7000000, "vipPoint": 0, "item":{}}, + { "level": 72, "point": 10000000, "vipPoint": 0, "item":{}}, + { "level": 76, "point": 16000000, "vipPoint": 0, "item":{}}, + { "level": 80, "point": 27000000, "vipPoint": 0, "item":{}}, + { "level": 85, "point": 43000000, "vipPoint": 0, "item":{}}, + { "level": 90, "point": 65000000, "vipPoint": 0, "item":{}}, + { "level": 95, "point": 93000000, "vipPoint": 0, "item":{}} + ], + "gold": [ + { "level": 58, "point": 4000000, "vipPoint": 0, "item":{}}, + { "level": 59, "point": 4200000, "vipPoint": 0, "item":{}}, + { "level": 60, "point": 4400000, "vipPoint": 0, "item":{}}, + { "level": 61, "point": 4600000, "vipPoint": 0, "item":{}}, + { "level": 62, "point": 4800000, "vipPoint": 0, "item":{}}, + { "level": 63, "point": 5000000, "vipPoint": 0, "item":{}}, + { "level": 64, "point": 5200000, "vipPoint": 0, "item":{}}, + { "level": 65, "point": 5400000, "vipPoint": 0, "item":{}}, + { "level": 66, "point": 5600000, "vipPoint": 0, "item":{}}, + { "level": 67, "point": 5800000, "vipPoint": 0, "item":{}}, + { "level": 68, "point": 6000000, "vipPoint": 0, "item":{}}, + { "level": 69, "point": 6200000, "vipPoint": 0, "item":{}}, + { "level": 70, "point": 6600000, "vipPoint": 0, "item":{}}, + { "level": 71, "point": 7000000, "vipPoint": 0, "item":{}}, + { "level": 72, "point": 7400000, "vipPoint": 0, "item":{}}, + { "level": 73, "point": 7800000, "vipPoint": 0, "item":{}}, + { "level": 74, "point": 8200000, "vipPoint": 0, "item":{}}, + { "level": 75, "point": 8600000, "vipPoint": 0, "item":{}}, + { "level": 77, "point": 9500000, "vipPoint": 0, "item":{}}, + { "level": 79, "point": 10400000, "vipPoint": 0, "item":{}}, + { "level": 83, "point": 12200000, "vipPoint": 0, "item":{}}, + { "level": 83, "point": 12200000, "vipPoint": 0, "item":{}}, + { "level": 85, "point": 13100000, "vipPoint": 0, "item":{}}, + { "level": 87, "point": 14000000, "vipPoint": 0, "item":{}}, + { "level": 90, "point": 16000000, "vipPoint": 0, "item":{}}, + { "level": 94, "point": 20000000, "vipPoint": 0, "item":{}}, + { "level": 98, "point": 28000000, "vipPoint": 0, "item":{}}, + { "level": 103, "point": 44000000, "vipPoint": 0, "item":{}}, + { "level": 108, "point": 76000000, "vipPoint": 0, "item":{}}, + { "level": 113, "point": 1080000000, "vipPoint": 0, "item":{}} + ] + } +} diff --git a/legacy/zhenxun_plugin_farm/core/__init__.py b/legacy/zhenxun_plugin_farm/core/__init__.py new file mode 100644 index 0000000..722d81e --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/__init__.py @@ -0,0 +1,29 @@ +from .database import g_pDBlocator, g_pSqlManager +from .help import CHelpManager +from .player.player import CPlayer +from .player.playerPool import g_pUserPool +from .shop import CShopManager + + +def getFarmManager(): + from .farm import CFarmManager + + return CFarmManager() + + +def getSignInManager(): + from .activity.sign_in import CSignInManager + + return CSignInManager() + + +__all__ = [ + "CHelpManager", + "CPlayer", + "CShopManager", + "g_pDBlocator", + "g_pSqlManager", + "g_pUserPool", + "getFarmManager", + "getSignInManager", +] diff --git a/legacy/zhenxun_plugin_farm/core/activity/activity.py b/legacy/zhenxun_plugin_farm/core/activity/activity.py new file mode 100644 index 0000000..cd77330 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/activity/activity.py @@ -0,0 +1,108 @@ +class ActivityManager: + """活动管理器""" + + def __init__(self): + self.activities = {} # 活动ID -> 活动配置 + self.active_activities = set() # 当前活跃的活动ID + self.effect_handlers = {} # 效果类型 -> 处理器 + + # 注册效果处理器 + self._register_handlers() + + def _register_handlers(self): + """注册所有效果处理器""" + self.effect_handlers[EffectType.MULTIPLIER] = MultiplierHandler() + self.effect_handlers[EffectType.FIXED_BONUS] = FixedBonusHandler() + self.effect_handlers[EffectType.BUFF_APPLICATION] = BuffApplicationHandler() + self.effect_handlers[EffectType.QUEST_TRIGGER] = QuestTriggerHandler() + + def load_activities_from_config(self, config_path: str): + """从配置文件加载活动""" + with open(config_path, encoding="utf-8") as f: + config = json.load(f) + + for activity_data in config["activities"]: + activity = Activity(activity_data) + self.activities[activity.id] = activity + print(f"加载活动: {activity.name}") + + def update_activity_status(self): + """更新活动状态(定时调用)""" + now = datetime.now() + + for activity in self.activities.values(): + is_active = activity.start_time <= now <= activity.end_time + + if is_active and activity.id not in self.active_activities: + # 活动开始 + self.active_activities.add(activity.id) + print(f"活动开始: {activity.name}") + + elif not is_active and activity.id in self.active_activities: + # 活动结束 + self.active_activities.remove(activity.id) + print(f"活动结束: {activity.name}") + + def get_active_activities(self, activity_type: ActivityType = None) -> List: + """获取当前活跃的活动""" + active_list = [] + + for activity_id in self.active_activities: + activity = self.activities[activity_id] + if activity_type is None or activity.activity_type == activity_type: + active_list.append(activity) + + return active_list + + def apply_activity_effects( + self, + activity_type: ActivityType, + player: Player, + base_value: int, + context: Dict = None, + ) -> int: + """应用活动效果""" + if context is None: + context = {} + + context["base_value"] = base_value + result = base_value + + # 获取同类型的所有活跃活动 + active_activities = self.get_active_activities(activity_type) + + for activity in active_activities: + print(f"为玩家 {player.player_id} 应用活动: {activity.name}") + + for effect in activity.effects: + handler = self.effect_handlers.get(effect.type) + if handler: + try: + effect_result = handler.execute(effect.params, player, context) + if effect_result is not None: + result = effect_result + context["base_value"] = result # 更新基础值供后续效果使用 + except Exception as e: + print(f"效果执行失败: {effect.type}, 错误: {e}") + + return result + + +class Activity: + """活动类""" + + def __init__(self, data: Dict): + self.id = data["id"] + self.name = data["name"] + self.activity_type = ActivityType(data["activity_type"]) + self.start_time = datetime.strptime(data["start_time"], "%Y-%m-%d %H:%M:%S") + self.end_time = datetime.strptime(data["end_time"], "%Y-%m-%d %H:%M:%S") + self.effects = [Effect(effect_data) for effect_data in data["effects"]] + + +class Effect: + """效果类""" + + def __init__(self, data: Dict): + self.type = EffectType(data["type"]) + self.params = data.get("params", {}) diff --git a/legacy/zhenxun_plugin_farm/core/activity/effect.py b/legacy/zhenxun_plugin_farm/core/activity/effect.py new file mode 100644 index 0000000..1a0c702 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/activity/effect.py @@ -0,0 +1,95 @@ +from enum import Enum +from typing import Any + + +# 活动类型枚举 +class ActivityType(Enum): + PLANTING = "planting" # 种植活动 + HARVESTING = "harvesting" # 收获活动 + FISHING = "fishing" # 钓鱼活动 + COMBAT = "combat" # 战斗活动 + + +# 效果类型枚举 +class EffectType(Enum): + MULTIPLIER = "multiplier" # 倍数加成 + FIXED_BONUS = "fixed_bonus" # 固定加成 + BUFF_APPLICATION = "buff_application" # 施加BUFF + QUEST_TRIGGER = "quest_trigger" # 任务触发 + + +class EffectHandler: + """ + 效果处理器基类 + """ + + def execute(self, params: dict, uid: str, context: dict) -> Any: + raise NotImplementedError + + +class MultiplierHandler(EffectHandler): + """ + 倍数效果处理器 + """ + + def execute(self, params: dict, uid: str, context: dict) -> float: + base_value = context.get("base_value", 0) + multiplier = params.get("value", 1.0) + + # 检查条件 + if self._check_conditions(params.get("conditions", {}), player): + result = base_value * multiplier + print(f"倍数效果: {base_value} × {multiplier} = {result}") + return result + return base_value + + def _check_conditions(self, conditions: dict, player: Player) -> bool: + """检查生效条件""" + # 等级要求 + min_level = conditions.get("min_level", 0) + if player.level < min_level: + return False + + # 需要特定物品 + required_items = conditions.get("required_items", []) + for item in required_items: + if player.inventory.get(item, 0) <= 0: + return False + + return True + + +class FixedBonusHandler(EffectHandler): + """固定加成处理器""" + + def execute(self, params: dict, player: Player, context: dict) -> int: + base_value = context.get("base_value", 0) + bonus = params.get("value", 0) + + result = base_value + bonus + print(f"固定加成: {base_value} + {bonus} = {result}") + return result + + +class BuffApplicationHandler(EffectHandler): + """BUFF应用处理器""" + + def execute(self, params: dict, player: Player, context: dict) -> None: + buff_id = params["buff_id"] + duration = params.get("duration", 3600) # 默认1小时 + properties = params.get("properties", {}) + + player.add_buff(buff_id, duration, properties) + + # 立即应用BUFF效果(如果有) + if "immediate_effect" in params: + self._apply_immediate_effect(params["immediate_effect"], player) + + +class QuestTriggerHandler(EffectHandler): + """任务触发处理器""" + + def execute(self, params: dict, player: Player, context: dict) -> None: + quest_id = params["quest_id"] + print(f"为玩家 {player.player_id} 触发任务: {quest_id}") + # 这里会调用任务系统来分配任务 diff --git a/legacy/zhenxun_plugin_farm/core/activity/sign_in.py b/legacy/zhenxun_plugin_farm/core/activity/sign_in.py new file mode 100644 index 0000000..80e0a9e --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/activity/sign_in.py @@ -0,0 +1,152 @@ +from datetime import datetime +from typing import Any + +from zhenxun.configs.config import Config +from zhenxun.services.log import logger + +from ...utils import config, getJsonManager, getToolManager +from ..dbService import g_pDBService + + +class CSignInManager: + @classmethod + async def signInByUid(cls, uid: str) -> str: + toDay = getToolManager().dateTime().date().today() + message = "" + status = await g_pDBService.userSign.sign(uid, toDay.strftime("%Y-%m-%d")) + + # 如果完成签到 + if status == 1 or status == 2: + # 获取签到总天数 + signDay = await g_pDBService.userSign.getUserSignCountByDate( + uid, toDay.strftime("%Y-%m") + ) + exp, point = await g_pDBService.userSign.getUserSignRewardByDate( + uid, toDay.strftime("%Y-%m-%d") + ) + + message += config.g_sTranslation["signIn"]["success"].format( + day=signDay, exp=exp, num=point + ) + + jSign = await getJsonManager().getSign() + reward = jSign["continuou"].get(f"{signDay}", None) + + signType = Config.get_config("zhenxun_plugin_farm", "签到图片样式") + + if reward: + extraPoint = reward.get("point", 0) + extraExp = reward.get("exp", 0) + + plant = reward.get("plant", {}) + + message += config.g_sTranslation["signIn"]["grandTotal"].format( + exp=extraExp, num=extraPoint + ) + + vipPoint = reward.get("vipPoint", 0) + + if vipPoint > 0: + message += config.g_sTranslation["signIn"]["grandTotal1"].format( + num=vipPoint + ) + + if plant: + for key, value in plant.items(): + message += config.g_sTranslation["signIn"][ + "grandTotal2" + ].format(name=key, num=value) + else: + message = config.g_sTranslation["signIn"]["error1"] + pass + + return message + + @classmethod + def generateSignData( + cls, + todayRewards: list[dict[str, Any]], + cumulativeRewards: list[dict[str, Any]], + currentProgress: int, + totalMilestones: int, + consecutiveDays: int = 0, + ) -> dict[str, Any]: + """生成签到页面所需的数据 + + Args: + todayRewards (list[dict[str, Any]]): 今日奖励列表 + cumulativeRewards (list[dict[str, Any]]): 累计奖励列表 + currentProgress (int): 当前进度 + totalMilestones (int): 总里程碑数 + consecutiveDays (int, optional): 连续签到天数 + + Returns: + dict[str, Any]: 签到数据字典 + """ + + # 计算进度百分比 + progressPercentage = min(100, int((currentProgress / totalMilestones) * 100)) + + # 计算已达成里程碑数量 + achievedMilestones = 0 + for reward in cumulativeRewards: + if reward.get("achieved", False): + achievedMilestones += 1 + + return { + "currentDate": datetime.now().strftime("%Y年%m月%d日"), + "todayRewards": todayRewards, + "cumulativeRewards": cumulativeRewards, + "currentProgress": currentProgress, + "totalMilestones": totalMilestones, + "progressPercentage": progressPercentage, + "achievedMilestones": achievedMilestones, + "consecutiveDays": consecutiveDays, + } + + @classmethod + async def createSignImage( + cls, + todayRewards: list[dict[str, Any]], + cumulativeRewards: list[dict[str, Any]], + currentProgress: int, + totalMilestones: int, + consecutiveDays: int = 0, + ): + """创建签到图片的完整流程 + + Args: + todayRewards (list[dict[str, Any]]): 今日奖励列表 + cumulativeRewards (list[dict[str, Any]]): 累计奖励列表 + currentProgress (int): 当前进度 + totalMilestones (int): 总里程碑数 + consecutiveDays (int, optional): 连续签到天数 + """ + try: + templatePath = config.g_sResourcePath / "html/sign_in.html" + outputPath = config.g_sResourcePath / "temp_html/sign_in.html" + savePath = config.DATA_PATH / "farm_res/html/sign_in.png" + + # 1. 生成渲染数据 + context = cls.generateSignData( + todayRewards=todayRewards, + cumulativeRewards=cumulativeRewards, + currentProgress=currentProgress, + totalMilestones=totalMilestones, + consecutiveDays=consecutiveDays, + ) + + # 2. 渲染HTML文件 + getToolManager().renderHtmlToFile(templatePath, context, outputPath) + + # 3. 生成图片字节数据 + # imageBytes = await getToolManager().screenshotHtmlToBytes(outputPath) + + # 4. 保存图片文件 + await getToolManager().screenshotSave( + str(outputPath), str(savePath), 600, 800 + ) + + except Exception as e: + logger.error(f"❌ 生成签到图片时出错: {e}") + raise diff --git a/legacy/zhenxun_plugin_farm/core/database/__init__.py b/legacy/zhenxun_plugin_farm/core/database/__init__.py new file mode 100644 index 0000000..082319f --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/__init__.py @@ -0,0 +1,25 @@ +from .database import g_pSqlManager +from .dbServiceLocator import g_pDBlocator +from .plant import CPlantManager +from .user import CUserDB +from .userItem import CUserItemDB +from .userPlant import CUserPlantDB +from .userPlantCount import CUserPlantCountDB +from .userSeed import CUserSeedDB +from .userSign import CUserSignDB +from .userSoil import CUserSoilDB +from .userSteal import CUserStealDB + +__all__ = [ + "CPlantManager", + "CUserDB", + "CUserItemDB", + "CUserPlantCountDB", + "CUserPlantDB", + "CUserSeedDB", + "CUserSignDB", + "CUserSoilDB", + "CUserStealDB", + "g_pDBlocator", + "g_pSqlManager", +] diff --git a/legacy/zhenxun_plugin_farm/core/database/database.py b/legacy/zhenxun_plugin_farm/core/database/database.py new file mode 100644 index 0000000..0497a41 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/database.py @@ -0,0 +1,536 @@ +from abc import ABC +from contextlib import asynccontextmanager +import os +from pathlib import Path +import re +from typing import Any, ClassVar + +import aiosqlite + +from zhenxun.services.log import logger + +from ...utils import config +from .dbServiceLocator import g_pDBlocator + + +class CSqlManager(ABC): + """ + 数据库管理器基类 + 所有具体的数据管理器都应该继承这个类 + """ + + m_pDB: ClassVar[aiosqlite.Connection | None] = None + + def __init__(self): + self.m_sTableName: str | None = None + self.m_bInitialized: bool = False + + self.m_pDBPath = Path(config.g_sDBPath) + if self.m_pDBPath and not self.m_pDBPath.exists(): + os.makedirs(self.m_pDBPath, exist_ok=True) + + @classmethod + async def init(cls) -> bool: + try: + if cls.m_pDB is None: + cls.m_pDB = await aiosqlite.connect(config.g_sDBFilePath) + cls.m_pDB.row_factory = aiosqlite.Row + logger.debug("真寻农场数据库连接初始化成功") + return True + else: + logger.debug("真寻农场数据库连接已存在,跳过初始化") + return True + except Exception as e: + logger.error(f"真寻农场数据库连接初始化失败: {e}") + return False + + @classmethod + async def cleanup(cls): + try: + if not cls.isConnectionValid(): + logger.warning("真寻农场数据库连接已关闭或无效,跳过清理") + return + + if hasattr(cls, "m_pDB") and cls.m_pDB: + await cls.m_pDB.close() + cls.m_pDB = None + cls._initialized = False + logger.debug("真寻农场数据库连接已安全关闭") + else: + logger.debug("真寻农场数据库连接已不存在,无需关闭") + + except Exception as e: + logger.error(f"真寻农场数据库清理过程中出错: {e}") + cls.m_pDB = None + cls._initialized = False + + @classmethod + def isConnectionValid(cls) -> bool: + if not hasattr(cls, "m_pDB") or cls.m_pDB is None: + return False + + try: + return hasattr(cls.m_pDB, "_conn") and cls.m_pDB._conn is not None + except: + return False + + @classmethod + def getDB(cls) -> aiosqlite.Connection: + if cls.m_pDB is None: + raise RuntimeError("数据库连接未初始化,请先调用 init_global_db()") + return cls.m_pDB + + @classmethod + def getPlantManager(cls) -> Any: + return g_pDBlocator.getPlantManager() + + @classmethod + def getUserManager(cls) -> Any: + return g_pDBlocator.getUserManager() + + @classmethod + def getUserSoilManager(cls) -> Any: + return g_pDBlocator.getUserSoilManager() + + @classmethod + def getUserSeedManager(cls) -> Any: + return g_pDBlocator.getUserSeedManager() + + @classmethod + def getUserItemManager(cls) -> Any: + return g_pDBlocator.getUserItemManager() + + @classmethod + def getUserStealManager(cls) -> Any: + return g_pDBlocator.getUserStealManager() + + @classmethod + def getUserSignManager(cls) -> Any: + return g_pDBlocator.getUserSignManager() + + @classmethod + def getUserPlantCountManager(cls) -> Any: + return g_pDBlocator.getUserPlantCountManager() + + def isInitialized(self) -> bool: + """检查是否已初始化""" + return self.m_bInitialized + + def setInitialized(self) -> None: + """标记为已初始化""" + self.m_bInitialized = True + + @classmethod + @asynccontextmanager + async def _transaction(cls): + await cls.getDB().execute("BEGIN;") + try: + yield + except: + await cls.getDB().execute("ROLLBACK;") + raise + else: + await cls.getDB().execute("COMMIT;") + + @classmethod + async def getTableInfo(cls, tableName: str) -> list: + if not re.match(r"^[A-Za-z_][A-Za-z0-9_]*$", tableName): + raise ValueError(f"Illegal table name: {tableName}") + try: + cursor = await cls.getDB().execute(f'PRAGMA table_info("{tableName}")') + rows = await cursor.fetchall() + return [{"name": row[1], "type": row[2]} for row in rows] + except aiosqlite.Error: + return [] + + # @classmethod + # async def ensureTableSchema(cls, tableName: str, columns: dict) -> bool: + # """由AI生成 + # 创建表或为已存在表添加缺失字段。 + # 返回 True 表示有变更(创建或新增列),False 则无操作 + + # Args: + # tableName (str): 表名 + # columns (dict): 字典 + + # Returns: + # bool: + # """ + + # info = await cls.getTableInfo(tableName) + # existing = {col["name"]: col["type"].upper() for col in info} + # desired = {k: v.upper() for k, v in columns.items() if k != "PRIMARY KEY"} + # primaryKey = columns.get("PRIMARY KEY", "") + + # if not existing: + # colsDef = ", ".join(f'"{k}" {v}' for k, v in desired.items()) + # if primaryKey: + # colsDef += f", PRIMARY KEY {primaryKey}" + # await cls.getDB().execute(f'CREATE TABLE "{tableName}" ({colsDef});') + # return True + + # toAdd = [k for k in desired if k not in existing] + # toRemove = [k for k in existing if k not in desired] + # typeMismatch = [ + # k for k in desired if k in existing and existing[k] != desired[k] + # ] + + # if toAdd and not toRemove and not typeMismatch: + # for col in toAdd: + # await cls.getDB().execute( + # f'ALTER TABLE "{tableName}" ADD COLUMN "{col}" {columns[col]}' + # ) + # return True + + # async with cls._transaction(): + # tmpTable = f"{tableName}_new" + # colsDef = ", ".join(f'"{k}" {v}' for k, v in desired.items()) + # if primaryKey: + # colsDef += f", PRIMARY KEY {primaryKey}" + # await cls.getDB().execute(f'CREATE TABLE "{tmpTable}" ({colsDef});') + + # commonCols = [k for k in desired if k in existing] + # if commonCols: + # colsStr = ", ".join(f'"{c}"' for c in commonCols) + + # sql = ( + # f'INSERT INTO "{tmpTable}" ({colsStr}) ' + # f"SELECT {colsStr} " + # f'FROM "{tableName}";' + # ) + + # await cls.getDB().execute(sql) + # await cls.getDB().execute(f'DROP TABLE "{tableName}";') + # await cls.getDB().execute( + # f'ALTER TABLE "{tmpTable}" RENAME TO "{tableName}";' + # ) + # return True + + @classmethod + async def ensureTableSchema(cls, tableName: str, columns: dict) -> bool: + """由AI生成 + 创建表或为已存在表添加缺失字段。 + 返回 True 表示有变更(创建或新增列),False 则无操作 + + Args: + tableName (str): 表名 + columns (dict): 字典 + + Returns: + bool: + """ + info = await cls.getTableInfo(tableName) + existing = {col["name"]: col["type"].upper() for col in info} + desired = {k: v.upper() for k, v in columns.items() if k != "PRIMARY KEY"} + primaryKey = columns.get("PRIMARY KEY", "") + + if not existing: + colsDef = ", ".join(f'"{k}" {v}' for k, v in desired.items()) + if primaryKey: + colsDef += f", PRIMARY KEY {primaryKey}" + await cls.getDB().execute(f'CREATE TABLE "{tableName}" ({colsDef});') + return True + + toAdd = [k for k in desired if k not in existing] + toRemove = [k for k in existing if k not in desired] + typeMismatch = [ + k for k in desired if k in existing and existing[k] != desired[k] + ] + + if toRemove or typeMismatch: + return False + + if toAdd: + for col in toAdd: + try: + await cls.getDB().execute( + f'ALTER TABLE "{tableName}" ADD COLUMN "{col}" {columns[col]}' + ) + except aiosqlite.OperationalError as e: + if "duplicate column name" in str(e).lower(): + continue + else: + raise + return True + + return False + + @classmethod + async def executeDB(cls, command: str) -> bool: + """执行自定义SQL + + Args: + command (str): SQL语句 + + Returns: + bool: 是否执行成功 + """ + if not command: + return False + + try: + async with cls._transaction(): + await cls.getDB().execute(command) + return True + except Exception: + return False + + @classmethod + async def insert(cls, tableName: str, data: dict) -> bool: + """ + 插入数据 + + Args: + tableName: 表名 + data: 要插入的数据字典,键为字段名,值为字段值 + + Returns: + bool: 是否执行成功 + """ + if not data: + return False + + try: + # 构建参数化查询 + columns = ", ".join(f'"{k}"' for k in data.keys()) + placeholders = ", ".join("?" for _ in data.keys()) + values = list(data.values()) + + sql = f'INSERT INTO "{tableName}" ({columns}) VALUES ({placeholders})' + + async with cls._transaction(): + await cls.getDB().execute(sql, values) + return True + except Exception as e: + logger.debug("真寻农场插入数据失败!", e=e) + return False + + @classmethod + async def batch_insert(cls, tableName: str, data_list: list) -> bool: + """ + 批量插入数据 + + Args: + tableName: 表名 + data_list: 要插入的数据字典列表 + + Returns: + bool: 是否执行成功 + """ + if not data_list: + return False + + try: + # 使用第一个字典的键作为所有记录的字段 + columns = ", ".join(f'"{k}"' for k in data_list[0].keys()) + placeholders = ", ".join("?" for _ in data_list[0].keys()) + + sql = f'INSERT INTO "{tableName}" ({columns}) VALUES ({placeholders})' + + async with cls._transaction(): + await cls.getDB().executemany( + sql, [list(data.values()) for data in data_list] + ) + return True + except Exception as e: + logger.debug("真寻农场批量插入数据失败!", e=e) + return False + + @classmethod + async def select( + cls, + tableName: str, + columns: list[Any] | None = None, + where: dict[str, Any] | None = None, + order_by: str | None = None, + limit: int | None = None, + ) -> list[dict]: + """ + 查询数据 + + Args: + tableName: 表名 + columns: 要查询的字段列表,None表示所有字段 + where: 查询条件字典 + order_by: 排序字段 + limit: 限制返回记录数 + + Returns: + list: 查询结果列表,每个元素是一个字典 + """ + try: + # 构建SELECT部分 + if columns: + select_clause = ", ".join(f'"{col}"' for col in columns) + else: + select_clause = "*" + + sql = f'SELECT {select_clause} FROM "{tableName}"' + + # 构建WHERE部分 + params = [] + if where: + where_conditions = [] + for key, value in where.items(): + if isinstance(value, (list, tuple)): + # 处理IN查询 + placeholders = ", ".join("?" for _ in value) + where_conditions.append(f'"{key}" IN ({placeholders})') + params.extend(value) + else: + where_conditions.append(f'"{key}" = ?') + params.append(value) + + if where_conditions: + sql += " WHERE " + " AND ".join(where_conditions) + + # 构建ORDER BY部分 + if order_by: + sql += f" ORDER BY {order_by}" + + # 构建LIMIT部分 + if limit: + sql += f" LIMIT {limit}" + + cursor = await cls.getDB().execute(sql, params) + rows = await cursor.fetchall() + + # 转换为字典列表 + result = [] + for row in rows: + result.append(dict(row)) + + return result + except Exception as e: + logger.debug("真寻农场查询数据失败!", e=e) + return [] + + @classmethod + async def update(cls, tableName: str, data: dict, where: dict) -> bool: + """ + 更新数据 + + Args: + tableName: 表名 + data: 要更新的数据字典 + where: 更新条件字典 + + Returns: + bool: 是否执行成功 + """ + if not data: + return False + + if not where: + return False + + try: + # 构建SET部分 + set_conditions = [] + params = [] + for key, value in data.items(): + set_conditions.append(f'"{key}" = ?') + params.append(value) + + # 构建WHERE部分 + where_conditions = [] + for key, value in where.items(): + where_conditions.append(f'"{key}" = ?') + params.append(value) + + sql = f'UPDATE "{tableName}" SET {", ".join(set_conditions)} WHERE {" AND ".join(where_conditions)}' + + async with cls._transaction(): + cursor = await cls.getDB().execute(sql, params) + # 检查是否影响了行 + return cursor.rowcount > 0 + except Exception as e: + logger.debug("真寻农场更新数据失败!", e=e) + return False + + @classmethod + async def delete(cls, tableName: str, where: dict) -> bool: + """ + 删除数据 + + Args: + tableName: 表名 + where: 删除条件字典 + + Returns: + bool: 是否执行成功 + """ + if not where: + return False + + try: + # 构建WHERE部分 + where_conditions = [] + params = [] + for key, value in where.items(): + where_conditions.append(f'"{key}" = ?') + params.append(value) + + sql = f'DELETE FROM "{tableName}" WHERE {" AND ".join(where_conditions)}' + + async with cls._transaction(): + cursor = await cls.getDB().execute(sql, params) + # 检查是否影响了行 + return cursor.rowcount > 0 + except Exception as e: + logger.debug("真寻农场删除数据失败!", e=e) + return False + + @classmethod + async def exists(cls, tableName: str, where: dict) -> bool: + """ + 检查记录是否存在 + + Args: + tableName: 表名 + where: 查询条件字典 + + Returns: + bool: 是否存在符合条件的记录 + """ + try: + result = await cls.select(tableName, columns=["1"], where=where, limit=1) + return len(result) > 0 + except Exception as e: + logger.debug("真寻农场检查数据失败!", e=e) + return False + + @classmethod + async def count(cls, tableName: str, where: dict = {}) -> int: + """ + 统计记录数量 + + Args: + tableName: 表名 + where: 查询条件字典 + + Returns: + int: 记录数量 + """ + try: + # 构建WHERE部分 + sql = f'SELECT COUNT(*) as count FROM "{tableName}"' + params = [] + + if where: + where_conditions = [] + for key, value in where.items(): + where_conditions.append(f'"{key}" = ?') + params.append(value) + + sql += " WHERE " + " AND ".join(where_conditions) + + cursor = await cls.getDB().execute(sql, params) + row = await cursor.fetchone() + return row["count"] if row else 0 + except Exception as e: + logger.debug("真寻农场统计数据失败!", e=e) + return 0 + + +g_pSqlManager = CSqlManager() diff --git a/legacy/zhenxun_plugin_farm/core/database/dbServiceLocator.py b/legacy/zhenxun_plugin_farm/core/database/dbServiceLocator.py new file mode 100644 index 0000000..b008bb9 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/dbServiceLocator.py @@ -0,0 +1,85 @@ +from typing import Any, Optional + +from zhenxun.services.log import logger + + +class CDBServiceLocator: + """ + 数据库服务定位器 + 负责管理所有数据库服务实例,提供统一的访问接口 + """ + + m_pInstance: Optional["CDBServiceLocator"] = None + + def __init__(self): + self.m_pServices: dict[str, Any] = {} + self.m_bInitialized = False + + @classmethod + def getInstance(cls) -> "CDBServiceLocator": + """ + 获取单例实例 + """ + if cls.m_pInstance is None: + cls.m_pInstance = cls() + return cls.m_pInstance + + def register(self, name: str, service: Any) -> None: + """ + 注册服务实例 + """ + if name in self.m_pServices: + logger.error(f"真寻农场服务 {name} 已经注册") + self.m_pServices[name] = service + + def get(self, name: str) -> Any: + """ + 获取服务实例 + """ + if name not in self.m_pServices: + raise KeyError(f"服务 {name} 未注册") + return self.m_pServices[name] + + def getPlantManager(self): + return self.get("plant") + + def getUserManager(self): + return self.get("user") + + def getUserSoilManager(self): + return self.get("userSoil") + + def getUserPlantManager(self): + return self.get("userPlant") + + def getUserSeedManager(self): + return self.get("userSeed") + + def getUserItemManager(self): + return self.get("userItem") + + def getUserStealManager(self): + return self.get("userSteal") + + def getUserSignManager(self): + return self.get("userSign") + + def getUserPlantCountManager(self): + return self.get("userPlantCount") + + def markInitialized(self): + """ + 标记初始化完成 + """ + self.m_bInitialized = True + + @property + def initialized(self) -> bool: + """ + 检查是否已初始化 + """ + return self.m_bInitialized + + +# 全局服务定位器实例 +g_pDBlocator = CDBServiceLocator.getInstance() diff --git a/legacy/zhenxun_plugin_farm/core/database/plant.py b/legacy/zhenxun_plugin_farm/core/database/plant.py new file mode 100644 index 0000000..b6f1589 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/plant.py @@ -0,0 +1,290 @@ +from contextlib import asynccontextmanager +import os + +import aiosqlite + +from zhenxun.configs.config import Config +from zhenxun.services.log import logger + +from ...utils import config, getRequestManager + + +class CPlantManager: + def __init__(self): + self.m_sTableName = "plant" + self.m_bInitialized = False + + try: + os.mkdir(config.g_sPlantPath) + except FileExistsError: + pass + + async def cleanup(self): + if hasattr(self, "m_pDB") and self.m_pDB: + await self.m_pDB.close() + + async def init(self) -> bool: + try: + _ = os.path.exists(config.g_sPlantPath) + + if config.g_bIsDebug: + self.m_pDB = await aiosqlite.connect( + str(config.g_sPlantPath.parent / "plant-test.db") + ) + else: + self.m_pDB = await aiosqlite.connect(str(config.g_sPlantPath)) + + self.m_pDB.row_factory = aiosqlite.Row + return True + except Exception as e: + logger.warning("初始化植物数据库失败", e=e) + return False + + async def initDB(self): + self.m_bInitialized = True + + @asynccontextmanager + async def _transaction(self): + await self.m_pDB.execute("BEGIN;") + try: + yield + except: + await self.m_pDB.execute("ROLLBACK;") + raise + else: + await self.m_pDB.execute("COMMIT;") + + async def executeDB(self, command: str) -> bool: + """执行自定义SQL + + Args: + command (str): SQL语句 + + Returns: + bool: 是否执行成功 + """ + if not command: + logger.warning("数据库语句长度为空!") + return False + + try: + async with self._transaction(): + await self.m_pDB.execute(command) + return True + except Exception as e: + logger.warning(f"数据库语句执行出错: {command}", e=e) + return False + + async def getPlantByName(self, name: str) -> dict | None: + """根据作物名称查询记录 + + Args: + name (str): 作物名称 + + Returns: + dict | None: 返回记录字典,未找到返回None + """ + try: + async with self.m_pDB.execute( + "SELECT * FROM plant WHERE name = ?", (name,) + ) as cursor: + row = await cursor.fetchone() + return dict(row) if row else None + except Exception as e: + logger.warning(f"查询作物失败: {name}", e=e) + return None + + async def getPlantPhaseByName(self, name: str) -> list[int]: + """根据作物名称获取作物各个阶段 + + Args: + name (str): 作物名称 + + Returns: + list: 阶段数组 + """ + try: + async with self.m_pDB.execute( + "SELECT phase FROM plant WHERE name = ?", (name,) + ) as cursor: + row = await cursor.fetchone() + + if not row: + return [] + + phase = row[0].split(",") + + seen = set() + result = [] + + for x in phase: + num = int(x) + + if num not in seen: + seen.add(num) + result.append(num) + + return result + except Exception as e: + logger.warning(f"查询作物阶段失败: {name}", e=e) + return [] + + async def getPlantPhaseNumberByName(self, name: str) -> int: + """根据作物名称获取作物总阶段数 + + Args: + name (str): 作物名称 + + Returns: + int: 总阶段数 + """ + try: + async with self.m_pDB.execute( + "SELECT phase FROM plant WHERE name = ?", (name,) + ) as cursor: + row = await cursor.fetchone() + + if not row: + return -1 + + phase = row[0].split(",") + + # 去重 + seen = set() + result = [] + for x in phase: + if x not in seen: + seen.add(x) + result.append(x) + + return len(result) + except Exception as e: + logger.warning(f"查询作物阶段失败: {name}", e=e) + return -1 + + async def getPlantAgainByName(self, name: str) -> int: + """根据作物名称获取作物再次成熟时间 + + Args: + name (str): 作物名称 + + Returns: + int: 再次成熟时间 单位:h + """ + + try: + async with self.m_pDB.execute( + "SELECT phase FROM plant WHERE name = ?", (name,) + ) as cursor: + row = await cursor.fetchone() + + if not row: + return -1 + + phase = row[0].split(",") + again = phase[-1] - phase[3] / 60 / 60 + + return again + + except Exception as e: + logger.warning(f"查询作物阶段失败: {name}", e=e) + return -1 + + async def existsPlant(self, name: str) -> bool: + """判断作物是否存在 + + Args: + name (str): 作物名称 + + Returns: + bool: 存在返回True,否则False + """ + try: + async with self.m_pDB.execute( + "SELECT 1 FROM plant WHERE name = ? LIMIT 1", (name,) + ) as cursor: + row = await cursor.fetchone() + return True if row else False + except Exception as e: + logger.warning(f"检查作物存在性失败: {name}", e=e) + return False + + async def countPlants(self, onlyBuy: bool = False) -> int: + """获取作物总数 + + Args: + onlyBuy (bool): 若为True,仅统计isBuy=1的记录,默认False + + Returns: + int: 符合条件的记录数 + """ + try: + if onlyBuy: + sql = "SELECT COUNT(*) FROM plant WHERE isBuy = 1" + params: tuple = () + else: + sql = "SELECT COUNT(*) FROM plant" + params: tuple = () + async with self.m_pDB.execute(sql, params) as cursor: + row = await cursor.fetchone() + return row[0] if row else 0 + except Exception as e: + logger.warning(f"统计作物数量失败, onlyBuy={onlyBuy}", e=e) + return 0 + + async def listPlants(self) -> list[dict]: + """查询所有作物记录""" + try: + async with self.m_pDB.execute( + "SELECT * FROM plant ORDER BY level" + ) as cursor: + rows = await cursor.fetchall() + return [dict(r) for r in rows] + except Exception as e: + logger.warning("查询所有作物失败", e=e) + return [] + + async def downloadPlant(self) -> bool: + """遍历所有作物,下载各阶段图片及icon文件到指定文件夹 + + Returns: + bool: 全部下载完成返回True,如有失败返回False + """ + success = True + baseUrl = Config.get_config("zhenxun_plugin_farm", "服务地址") + + baseUrl = baseUrl.rstrip("/") + ":8998/file" + try: + plants = await self.listPlants() + for plant in plants: + name = plant["name"] + phaseCount = await self.getPlantPhaseNumberByName(name) + saveDir = os.path.join(config.g_sResourcePath, "plant", name) + begin = 0 if plant["general"] == 0 else 1 + + for idx in range(begin, phaseCount + 1): + fileName = f"{idx}.png" + fullPath = os.path.join(saveDir, fileName) + + if os.path.exists(fullPath): + continue + + url = f"{baseUrl}/{name}/{idx}.png" + if not await getRequestManager().download( + url, saveDir, f"{idx}.png" + ): + success = False + + iconName = "icon.png" + iconPath = os.path.join(saveDir, iconName) + if not os.path.exists(iconPath): + iconUrl = f"{baseUrl}/{name}/{iconName}" + if not await getRequestManager().download( + iconUrl, saveDir, iconName + ): + success = False + + return success + except Exception as e: + logger.warning(f"下载作物资源异常: {e}") + return False diff --git a/legacy/zhenxun_plugin_farm/core/database/user.py b/legacy/zhenxun_plugin_farm/core/database/user.py new file mode 100644 index 0000000..0468350 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/user.py @@ -0,0 +1,214 @@ +import math + +from ...utils import getToolManager +from .database import CSqlManager + + +class CUserDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "user" + self.currencies: list[str] = ["point", "vipPoint"] + + async def initDB(self): + userInfo = { + "uid": "TEXT PRIMARY KEY", # 用户Uid + "name": "TEXT NOT NULL", # 农场名称 + "exp": "INTEGER DEFAULT 0", # 经验值 + "point": "INTEGER DEFAULT 0", # 金币 + "vipPoint": "INTEGER DEFAULT 0", # 点券 + "soil": "INTEGER DEFAULT 3", # 解锁土地数量 + "stealTime": "TEXT DEFAULT ''", # 偷菜时间字符串 + "stealCount": "INTEGER DEFAULT 0", # 剩余偷菜次数 + } + + await self.ensureTableSchema("user", userInfo) + self.setInitialized() + + async def initUserInfo(self, uid: str, name: str) -> bool: + """初始化用户信息 + + Args: + uid (str): 用户ID + name (str): 农场名称 + + Returns: + bool: 是否成功初始化用户信息 + """ + nowStr = getToolManager().dateTime().date().today().strftime("%Y-%m-%d") + + result = await self.insert( + "user", + data={ + "uid": uid, + "name": name, + "exp": 0, + "point": 500, + "soil": 3, + "stealTime": nowStr, + "stealCount": 5, + }, + ) + + return result + + async def getUserInfoByUid(self, uid: str) -> dict: + """根据用户ID获取用户信息 + + Args: + uid (str): 用户ID + + Returns: + dict: 用户信息字典,未找到返回空字典 + """ + if uid == "": + return {} + + records = await self.select("user", where={"uid": uid}) + + return records[0] if records else {} + + async def isRegistered(self, uid: str) -> bool: + """检查用户是否注册农场 + + Args: + uid (str): 用户ID + + Returns: + bool: 是否注册农场 + """ + if uid == "": + return False + + return await self.exists("user", where={"uid": uid}) + + async def updatePoint(self, uid: str, type: str, index: int) -> bool: + """更新货币 + + Args: + uid (str): 用户ID + type (str): 货币类型 point/vipPoint + index (int): 更新后的数量 + + Returns: + bool: 是否成功更新货币 + """ + if type not in self.currencies: + return False + + if index < 0: + index = 0 + + await self.update("user", {type: index}, {"uid": uid}) + + return True + + async def updateExp(self, uid: str, exp: int) -> bool: + """更新经验值 + + Args: + uid (str): 用户ID + exp (int): 更新后的经验值 + + Returns: + bool: 是否成功更新经验值 + """ + if exp < 0: + exp = 0 + + return await self.update("user", {"exp": exp}, {"uid": uid}) + + async def updateName(self, uid: str, name: str) -> str: + """更新农场名称 + + Args: + uid (str): 用户ID + name (str): 农场名称 + + Returns: + bool: 是否成功更新农场名称 + """ + safeName = getToolManager().sanitize_username(name) + + if safeName == "神秘农夫": + return "error" + + if await self.update("user", {"name": safeName}, {"uid": uid}): + return "success" + + return "error1" + + async def getUserLevelByUid(self, uid: str) -> tuple[int, int, int]: + """获取用户等级信息 + + Args: + uid (str): 用户Uid + + Returns: + tuple[int, int, int]: 成功返回(当前等级, 升至下级还需经验, 当前等级已获经验) + 失败返回(-1, -1, -1) + """ + if not uid: + return -1, -1, -1 + + records = await self.select("user", where={"uid": uid}, columns=["exp"]) + + if not records: + return -1, -1, -1 + + try: + exp = int(records[0].get("exp", 0)) + except Exception: + exp = 0 + + levelStep = 200 # 每级经验增量 + + discriminant = 1 + 8 * exp / levelStep + level = int((-1 + math.sqrt(discriminant)) // 2) + if level < 0: + level = 0 + + def cumExp(k: int) -> int: + return levelStep * k * (k + 1) // 2 + + totalExpCurrentLevel = cumExp(level) + totalExpNextLevel = cumExp(level + 1) + + currentExp = exp - totalExpCurrentLevel + + return level, totalExpNextLevel, currentExp + + async def updateStealCountByUid( + self, uid: str, stealTime: str, stealCount: int + ) -> bool: + """根据用户Uid更新剩余偷菜次数 + + Args: + uid (str): 用户Uid + stealTime (str): 偷菜日期 + stealCount (int): 新剩余偷菜次数 + + Returns: + bool: 是否更新成功 + """ + if not uid or stealCount < 0: + return False + + return await self.update( + "user", {"stealTime": stealTime, "stealCount": stealCount}, {"uid": uid} + ) + + async def updateFieldByUid(self, uid: str, field: str, value) -> bool: + """更新单字段信息 + + Args: + uid (str): 用户Uid + field (str): 字段名称 + + Returns: + bool: 是否成功更新字段 + """ + if not uid or not field: + return False + + return await self.update("user", {field: value}, {"uid": uid}) diff --git a/legacy/zhenxun_plugin_farm/core/database/userItem.py b/legacy/zhenxun_plugin_farm/core/database/userItem.py new file mode 100644 index 0000000..a9adf87 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userItem.py @@ -0,0 +1,162 @@ +from zhenxun.services.log import logger + +from .database import CSqlManager + + +class CUserItemDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userItem" + + async def initDB(self): + userItem = { + "uid": "TEXT NOT NULL", # 用户Uid + "item": "TEXT NOT NULL", # 物品名称 + "count": "INTEGER NOT NULL DEFAULT 0", # 数量 + "PRIMARY KEY": "(uid, item)", + } + + await self.ensureTableSchema("userItem", userItem) + self.setInitialized() + + @classmethod + async def getUserItemByName(cls, uid: str, item: str) -> int | None: + """根据道具名称查询某一项数量 + + Args: + uid (str): 用户uid + item (str): 道具名称 + + Returns: + Optional[int]: 数量(不存在返回None) + """ + if not uid or not item: + return None + try: + async with cls.getDB().execute( + "SELECT count FROM userItem WHERE uid = ? AND item = ?", (uid, item) + ) as cursor: + row = await cursor.fetchone() + return row[0] if row else None + except Exception as e: + logger.warning("getUserItemByName查询失败!", e=e) + return None + + @classmethod + async def getUserItemByUid(cls, uid: str) -> dict: + """根据用户Uid获取全部道具信息 + + Args: + uid (str): 用户uid + + Returns: + dict: {itemName: count, ...} + """ + if not uid: + return {} + try: + cursor = await cls.getDB().execute( + "SELECT item, count FROM userItem WHERE uid = ?", (uid,) + ) + rows = await cursor.fetchall() + return {row["item"]: row["count"] for row in rows} + except Exception as e: + logger.warning("getUserItemByUid查询失败!", e=e) + return {} + + @classmethod + async def deleteUserItemByName(cls, uid: str, item: str) -> bool: + """根据道具名删除道具 + + Args: + uid (str): 用户uid + item (str): 道具名称 + + Returns: + bool: 是否删除成功 + """ + if not uid or not item: + return False + try: + async with cls._transaction(): + await cls.getDB().execute( + "DELETE FROM userItem WHERE uid = ? AND item = ?", (uid, item) + ) + return True + except Exception as e: + logger.warning("deleteUserItemByName失败!", e=e) + return False + + @classmethod + async def updateUserItemByName(cls, uid: str, item: str, count: int) -> bool: + """根据道具名直接更新道具数量 + + Args: + uid (str): 用户uid + item (str): 道具名称 + count (int): 要更新的新数量 + + Returns: + bool: 是否更新成功 + """ + if not uid or not item: + return False + try: + async with cls._transaction(): + if count <= 0: + await cls.getDB().execute( + "DELETE FROM userItem WHERE uid = ? AND item = ?", (uid, item) + ) + else: + await cls.getDB().execute( + "UPDATE userItem SET count = ? WHERE uid = ? AND item = ?", + (count, uid, item), + ) + return True + except Exception as e: + logger.warning("updateUserItemByName失败!", e=e) + return False + + @classmethod + async def addUserItemByUid(cls, uid: str, item: str, count: int = 1) -> bool: + """根据用户uid添加道具信息 + + Args: + uid (str): 用户uid + item (str): 道具名称 + count (int, optional): 数量.Defaults to 1. + + Returns: + bool: 是否添加成功 + """ + if not uid or not item: + return False + try: + async with cls._transaction(): + async with cls.getDB().execute( + "SELECT count FROM userItem WHERE uid = ? AND item = ?", (uid, item) + ) as cursor: + row = await cursor.fetchone() + + if row: + newCount = row[0] + count + if newCount <= 0: + await cls.getDB().execute( + "DELETE FROM userItem WHERE uid = ? AND item = ?", + (uid, item), + ) + else: + await cls.getDB().execute( + "UPDATE userItem SET count = ? WHERE uid = ? AND item = ?", + (newCount, uid, item), + ) + else: + if count > 0: + await cls.getDB().execute( + "INSERT INTO userItem (uid, item, count) VALUES (?, ?, ?)", + (uid, item, count), + ) + return True + except Exception as e: + logger.warning("addUserItemByUid失败!", e=e) + return False diff --git a/legacy/zhenxun_plugin_farm/core/database/userPlant.py b/legacy/zhenxun_plugin_farm/core/database/userPlant.py new file mode 100644 index 0000000..c662925 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userPlant.py @@ -0,0 +1,209 @@ +from zhenxun.services.log import logger + +from .database import CSqlManager + + +class CUserPlantDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userPlant" + + async def initDB(self): + userPlant = { + "uid": "TEXT NOT NULL", # 用户Uid + "plant": "TEXT NOT NULL", # 作物名称 + "count": "INTEGER NOT NULL DEFAULT 0", # 数量 + "isLock": "INTEGER NOT NULL DEFAULT 0", # 是否上锁 0=没有,非0=有 + "PRIMARY KEY": "(uid, plant)", + } + + await self.ensureTableSchema("userPlant", userPlant) + self.setInitialized() + + @classmethod + async def addUserPlantByUid(cls, uid: str, plant: str, count: int = 1) -> bool: + """根据用户uid添加作物信息 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + count (int): 数量 + + Returns: + bool: 是否添加成功 + """ + try: + async with cls._transaction(): + # 检查是否已存在该作物 + async with cls.getDB().execute( + "SELECT count FROM userPlant WHERE uid = ? AND plant = ?", + (uid, plant), + ) as cursor: + row = await cursor.fetchone() + + if row: + # 如果作物已存在,则更新数量 + new_count = row[0] + count + await cls.getDB().execute( + "UPDATE userPlant SET count = ? WHERE uid = ? AND plant = ?", + (new_count, uid, plant), + ) + else: + # 如果作物不存在,则插入新记录 + await cls.getDB().execute( + "INSERT INTO userPlant (uid, plant, count) VALUES (?, ?, ?)", + (uid, plant, count), + ) + return True + except Exception as e: + logger.warning("addUserPlantByUid 失败!", e=e) + return False + + @classmethod + async def getUserPlantByUid(cls, uid: str) -> dict[str, int]: + """根据用户uid获取全部作物信息 + + Args: + uid (str): 用户uid + + Returns: + Dict[str, int]: 作物名称和数量 + """ + cursor = await cls.getDB().execute( + "SELECT plant, count FROM userPlant WHERE uid=?", (uid,) + ) + rows = await cursor.fetchall() + return {row["plant"]: row["count"] for row in rows} + + @classmethod + async def getUserPlantByName(cls, uid: str, plant: str) -> int | None: + """根据作物名称获取用户的作物数量 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + Optional[int]: 作物数量 + """ + try: + async with cls.getDB().execute( + "SELECT count FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) as cursor: + row = await cursor.fetchone() + return row[0] if row else None + except Exception as e: + logger.warning("getUserPlantByName 查询失败!", e=e) + return None + + @classmethod + async def checkUserPlantByName(cls, uid: str, plant: str) -> bool: + """根据作物名称判断用户作物仓库是否存在该作物 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + bool: 是否存在 + """ + try: + async with cls.getDB().execute( + "SELECT * FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) as cursor: + row = await cursor.fetchone() + return True if row else False + except Exception as e: + logger.warning("checkUserPlantByName 查询失败!", e=e) + return False + + @classmethod + async def updateUserPlantByName(cls, uid: str, plant: str, count: int) -> bool: + """更新 userPlant 表中某个作物的数量 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + count (int): 新的作物数量 + + Returns: + bool: 是否更新成功 + """ + try: + if count <= 0: + return await cls.deleteUserPlantByName(uid, plant) + + async with cls._transaction(): + await cls.getDB().execute( + "UPDATE userPlant SET count = ? WHERE uid = ? AND plant = ?", + (count, uid, plant), + ) + return True + except Exception as e: + logger.warning("updateUserPlantByName 失败!", e=e) + return False + + @classmethod + async def lockUserPlantByName(cls, uid: str, plant: str, lock: int) -> bool: + """给作物加锁,防止一键售卖 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + lock (int): 0为解锁,非0均为加锁 + + Returns: + bool: 是否加锁成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + "UPDATE userPlant SET isLock = ? WHERE uid = ? AND plant = ?", + (lock, uid, plant), + ) + return True + except Exception as e: + logger.warning("lockUserPlantByName 失败!", e=e) + return False + + @classmethod + async def checkPlantLockByName(cls, uid: str, plant: str) -> bool: + """根据作物名称判断是否加锁 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + bool: 是否加锁 + """ + try: + async with cls.getDB().execute( + "SELECT isLock FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) as cursor: + row = await cursor.fetchone() + return row[0] > 0 if row else False + except Exception as e: + logger.warning("checkUserPlantByName 查询失败!", e=e) + return False + + @classmethod + async def deleteUserPlantByName(cls, uid: str, plant: str) -> bool: + """从 userPlant 表中删除某个作物记录 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + bool: 是否删除成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + "DELETE FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) + return True + except Exception as e: + logger.warning("deleteUserPlantByName 失败!", e=e) + return False diff --git a/legacy/zhenxun_plugin_farm/core/database/userPlantCount.py b/legacy/zhenxun_plugin_farm/core/database/userPlantCount.py new file mode 100644 index 0000000..ac3142c --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userPlantCount.py @@ -0,0 +1,146 @@ +from zhenxun.services.log import logger + +from .database import CSqlManager + + +class CUserPlantCountDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userPlantCount" + + async def initDB(self): + userPlantCount = { + "uid": "TEXT NOT NULL", # 用户Uid + "plant": "TEXT NOT NULL", # 植物名称 + "count": "INTEGER NOT NULL DEFAULT 0", # 数量 + "PRIMARY KEY": "(uid, plant)", + } + + await self.ensureTableSchema("userPlantCount", userPlantCount) + self.setInitialized() + + @classmethod + async def addUserPlantCountByUid(cls, uid: str, plant: str, count: int = 1) -> bool: + """根据用户uid添加植物的收获次数 + + Args: + uid (str): 用户uid + plant (str): 植物名称 + count (int): 数量 + + Returns: + bool: 是否添加成功 + """ + try: + async with cls._transaction(): + async with cls.getDB().execute( + "SELECT count FROM userPlantCount WHERE uid = ? AND plant = ?", + (uid, plant), + ) as cursor: + row = await cursor.fetchone() + + if row: + newCount = row[0] + count + await cls.getDB().execute( + "UPDATE userPlantCount SET count = ? WHERE uid = ? AND plant = ?", + (newCount, uid, plant), + ) + else: + newCount = count + await cls.getDB().execute( + "INSERT INTO userPlantCount (uid, plant, count) VALUES (?, ?, ?)", + (uid, plant, count), + ) + + if newCount <= 0: + await cls.getDB().execute( + "DELETE FROM userPlantCount WHERE uid = ? AND plant = ?", + (uid, plant), + ) + return True + except Exception as e: + logger.warning("addUserPlantByUid 失败!", e=e) + return False + + @classmethod + async def getUserPlantCountByUid(cls, uid: str) -> dict: + """根据用户Uid获取该用户的所有植物的收获次数 + + Args: + uid (str): 用户uid + + Returns: + dict: 植物信息 + """ + + cursor = await cls.getDB().execute( + "SELECT plant, count FROM userPlantCount WHERE uid=?", (uid,) + ) + rows = await cursor.fetchall() + return {row["plant"]: row["count"] for row in rows} + + @classmethod + async def getUserPlantCountByPlantName(cls, uid: str, plant: str) -> int: + """根据用户Uid和植物名称获取该对应的收获次数 + + Args: + uid (str): 用户uid + plant (str): 植物名称 + + Returns: + int: 收获次数 + """ + cursor = await cls.getDB().execute( + "SELECT count FROM userPlantCount WHERE uid = ? AND plant = ?", + (uid, plant), + ) + row = await cursor.fetchone() + return row["count"] if row else 0 + + @classmethod + async def updateUserPlantCountByName(cls, uid: str, plant: str, count: int) -> bool: + """根据植物名称更新植物的收获次数 + + Args: + uid (str): 用户uid + plant (str): 植物名称 + count (int): 收获次数 + + Returns: + bool: 是否成功 + """ + try: + if count <= 0: + return await cls.deleteUserPlantCountByName(uid, plant) + + async with cls._transaction(): + await cls.getDB().execute( + "UPDATE userPlantCount SET count = ? WHERE uid = ? AND plant = ?", + (count, uid, plant), + ) + return True + except Exception as e: + logger.warning("updateUserPlantByName失败!", e=e) + return False + + @classmethod + async def deleteUserPlantCountByName(cls, uid: str, plant: str) -> bool: + """根据植物名称从植物仓库中删除植物 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + + Returns: + bool: 是否成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + "DELETE FROM userPlantCount WHERE uid = ? AND plant = ?", + (uid, plant), + ) + return True + except Exception as e: + logger.warning("deleteUserPlantCountByName 删除失败!", e=e) + return False diff --git a/legacy/zhenxun_plugin_farm/core/database/userSeed.py b/legacy/zhenxun_plugin_farm/core/database/userSeed.py new file mode 100644 index 0000000..a3597ab --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userSeed.py @@ -0,0 +1,216 @@ +from zhenxun.services.log import logger + +from .database import CSqlManager + + +class CUserSeedDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userSeed" + + async def initDB(self): + userSeed = { + "uid": "TEXT NOT NULL", # 用户Uid + "seed": "TEXT NOT NULL", # 种子名称 + "count": "INTEGER NOT NULL DEFAULT 0", # 数量 + "PRIMARY KEY": "(uid, seed)", + } + + await self.ensureTableSchema("userSeed", userSeed) + self.setInitialized() + + @classmethod + async def addUserSeedByUid(cls, uid: str, seed: str, count: int = 1) -> bool: + """根据用户uid添加种子信息(事务版本) + + Args: + uid (str): 用户uid + seed (str): 种子名称 + count (int): 数量 + + Returns: + bool: 是否添加成功 + """ + try: + async with cls._transaction(): + async with cls.getDB().execute( + "SELECT count FROM userSeed WHERE uid = ? AND seed = ?", (uid, seed) + ) as cursor: + row = await cursor.fetchone() + + if row: + newCount = row[0] + count + await cls.getDB().execute( + "UPDATE userSeed SET count = ? WHERE uid = ? AND seed = ?", + (newCount, uid, seed), + ) + else: + newCount = count + await cls.getDB().execute( + "INSERT INTO userSeed (uid, seed, count) VALUES (?, ?, ?)", + (uid, seed, count), + ) + + if newCount <= 0: + await cls.getDB().execute( + "DELETE FROM userSeed WHERE uid = ? AND seed = ?", (uid, seed) + ) + return True + except Exception as e: + logger.warning("addUserSeedByUid 失败!", e=e) + return False + + @classmethod + async def _addUserSeedByUid(cls, uid: str, seed: str, count: int = 1) -> bool: + """根据用户uid添加种子信息(非事务版,复用其他非事务接口)""" + try: + existing = await cls.getUserSeedByName(uid, seed) + newCount = (existing or 0) + count + + if existing is not None: + await cls._updateUserSeedByName(uid, seed, newCount) + else: + await cls.getDB().execute( + "INSERT INTO userSeed (uid, seed, count) VALUES (?, ?, ?)", + (uid, seed, newCount), + ) + + if newCount <= 0: + await cls._deleteUserSeedByName(uid, seed) + + return True + except Exception as e: + logger.warning("_addUserSeedByUid 失败!", e=e) + return False + + @classmethod + async def getUserSeedByName(cls, uid: str, seed: str) -> int | None: + """根据种子名称获取种子数量 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + + Returns: + Optional[int]: 种子数量 + """ + + try: + async with cls.getDB().execute( + "SELECT count FROM userSeed WHERE uid = ? AND seed = ?", (uid, seed) + ) as cursor: + row = await cursor.fetchone() + return row[0] if row else None + except Exception as e: + logger.warning("getUserSeedByName 查询失败!", e=e) + return None + + @classmethod + async def getUserSeedByUid(cls, uid: str) -> dict: + """根据用户Uid获取仓库全部种子信息 + + Args: + uid (str): 用户uid + + Returns: + dict: 种子信息 + """ + + cursor = await cls.getDB().execute( + "SELECT seed, count FROM userSeed WHERE uid=?", (uid,) + ) + rows = await cursor.fetchall() + return {row["seed"]: row["count"] for row in rows} + + @classmethod + async def updateUserSeedByName(cls, uid: str, seed: str, count: int) -> bool: + """根据种子名称更新种子数量 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + count (int): 种子数量 + + Returns: + bool: 是否成功 + """ + try: + if count <= 0: + return await cls.deleteUserSeedByName(uid, seed) + + async with cls._transaction(): + await cls.getDB().execute( + "UPDATE userSeed SET count = ? WHERE uid = ? AND seed = ?", + (count, uid, seed), + ) + return True + except Exception as e: + logger.warning("updateUserSeedByName失败!", e=e) + return False + + @classmethod + async def _updateUserSeedByName(cls, uid: str, seed: str, count: int) -> bool: + """根据种子名称更新种子数量 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + count (int): 种子数量 + + Returns: + bool: 是否成功 + """ + try: + if count <= 0: + return await cls.deleteUserSeedByName(uid, seed) + + async with cls._transaction(): + await cls.getDB().execute( + "UPDATE userSeed SET count = ? WHERE uid = ? AND seed = ?", + (count, uid, seed), + ) + return True + except Exception as e: + logger.warning("updateUserSeedByName失败!", e=e) + return False + + @classmethod + async def deleteUserSeedByName(cls, uid: str, seed: str) -> bool: + """根据种子名称从种子仓库中删除种子 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + + Returns: + bool: 是否成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + "DELETE FROM userSeed WHERE uid = ? AND seed = ?", (uid, seed) + ) + return True + except Exception as e: + logger.warning("deleteUserSeedByName 删除失败!", e=e) + return False + + @classmethod + async def _deleteUserSeedByName(cls, uid: str, seed: str) -> bool: + """根据种子名称从种子仓库中删除种子 + + Args: + uid (str): 用户uid + seed (str): 种子名称 + + Returns: + bool: 是否成功 + """ + try: + await cls.getDB().execute( + "DELETE FROM userSeed WHERE uid = ? AND seed = ?", (uid, seed) + ) + return True + except Exception as e: + logger.warning("deleteUserSeedByName 删除失败!", e=e) + return False diff --git a/legacy/zhenxun_plugin_farm/core/database/userSign.py b/legacy/zhenxun_plugin_farm/core/database/userSign.py new file mode 100644 index 0000000..f42902f --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userSign.py @@ -0,0 +1,293 @@ +import calendar +from datetime import timedelta +import random + +from zhenxun.services.log import logger +from zhenxun.utils._build_image import BuildImage + +from ...utils import config, getJsonManager, getToolManager +from .database import CSqlManager + + +class CUserSignDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userSign" + + async def initDB(self): + # userSignLog 表结构,每条为一次签到事件 + userSignLog = { + "uid": "TEXT NOT NULL", # 用户ID + "signDate": "DATE NOT NULL", # 签到日期 + "isSupplement": "TINYINT NOT NULL DEFAULT 0", # 是否补签 + "exp": "INT NOT NULL DEFAULT 0", # 当天签到经验 + "point": "INT NOT NULL DEFAULT 0", # 当天签到金币 + "createdAt": "DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))", # 创建时间 # noqa: E501 + "PRIMARY KEY": "(uid, signDate)", + } + + # userSignSummary 表结构,每用户一行用于缓存签到状态 + userSignSummary = { + "uid": "TEXT PRIMARY KEY NOT NULL", # 用户ID + "totalSignDays": "INT NOT NULL DEFAULT 0", # 累计签到天数 + "currentMonth": "CHAR(7) NOT NULL DEFAULT ''", # 当前月份(如2025-05) + "monthSignDays": "INT NOT NULL DEFAULT 0", # 本月签到次数 + "lastSignDate": "DATE DEFAULT NULL", # 上次签到日期 + "continuousDays": "INT NOT NULL DEFAULT 0", # 连续签到天数 + "supplementCount": "INT NOT NULL DEFAULT 0", # 补签次数 + "updatedAt": "DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime'))", # 更新时间 # noqa: E501 + } + + await self.ensureTableSchema("userSignLog", userSignLog) + await self.ensureTableSchema("userSignSummary", userSignSummary) + self.setInitialized() + + @classmethod + async def getUserSignRewardByDate(cls, uid: str, date: str) -> tuple[int, int]: + """根据指定日期获取用户签到随机奖励 + + Args: + uid (str): 用户Uid + date (str): 用户签到日期 示例:2025-05-27 + + Returns: + tuple[int, int]: 经验、金币 + """ + try: + async with cls._transaction(): + async with cls.getDB().execute( + "SELECT exp, point FROM userSignLog WHERE uid=? AND signDate=?", + (uid, date), + ) as cursor: + row = await cursor.fetchone() + + if row is None: + return 0, 0 + + exp = row["exp"] + point = row["point"] + + return exp, point + except Exception as e: + logger.warning("获取用户签到数据失败", e=e) + return 0, 0 + + @classmethod + async def getUserSignCountByDate(cls, uid: str, monthStr: str) -> int: + """根据日期查询用户签到总天数 + + Args: + uid (str): 用户Uid + monthStr (str): 需要查询的日期 示例: 2025-05 + + Returns: + int: 查询月总签到天数 + """ + try: + sql = "SELECT COUNT(*) FROM userSignLog WHERE uid=? AND signDate LIKE ?" + param = f"{monthStr}-%" + async with cls.getDB().execute(sql, (uid, param)) as cursor: + row = await cursor.fetchone() + return row[0] if row else 0 + except Exception as e: + logger.warning("统计用户月签到次数失败", e=e) + return 0 + + @classmethod + async def hasSigned(cls, uid: str, signDate: str) -> bool: + """判断指定日期是否已签到 + + Args: + uid (int): 用户ID + signDate (str): 日期字符串 'YYYY-MM-DD' + + Returns: + bool: True=已签到,False=未签到 + """ + try: + sql = "SELECT 1 FROM userSignLog WHERE uid=? AND signDate=? LIMIT 1" + async with cls.getDB().execute(sql, (uid, signDate)) as cursor: + row = await cursor.fetchone() + return row is not None + except Exception as e: + logger.warning("查询是否已签到失败", e=e) + return False + + @classmethod + async def sign(cls, uid: str, signDate: str = "") -> int: + """签到 + + Args: + uid (int): 用户ID + signDate (str): 日期字符串 'YYYY-MM-DD' 不传默认当前系统日期 + + Returns: + int: 0: 签到失败 1: 签到成功 2: 重复签到 + """ + try: + player = await getToolManager().getPlayerByUid(uid) + if not player: + return 0 + + if not signDate: + signDate = ( + getToolManager().dateTime().date().today().strftime("%Y-%m-%d") + ) + + if await cls.hasSigned(uid, signDate): + return 2 + + todayStr = getToolManager().dateTime().date().today().strftime("%Y-%m-%d") + isSupplement = 0 if signDate == todayStr else 1 + sign = await getJsonManager().getSign() + + expMax, expMin, pointMax, pointMin = [ + sign.get(key, default) + for key, default in ( + ("exp_max", 50), + ("exp_min", 5), + ("point_max", 2000), + ("point_min", 200), + ) + ] + + exp = random.randint(expMin, expMax) + point = random.randint(pointMin, pointMax) + vipPoint = 0 + + async with cls._transaction(): + await cls.getDB().execute( + "INSERT INTO userSignLog (uid, signDate, isSupplement, exp, point) VALUES (?, ?, ?, ?, ?)", + (uid, signDate, isSupplement, exp, point), + ) + + cursor = await cls.getDB().execute( + "SELECT * FROM userSignSummary WHERE uid=?", (uid,) + ) + row = await cursor.fetchone() + + currentMonth = signDate[:7] + if row: + monthSignDays = ( + row["monthSignDays"] + 1 + if row["currentMonth"] == currentMonth + else 1 + ) + prevDate = ( + getToolManager().dateTime().strptime(signDate, "%Y-%m-%d") + - timedelta(days=1) + ).strftime("%Y-%m-%d") + continuousDays = ( + row["continuousDays"] + 1 + if row["lastSignDate"] == prevDate + else 1 + ) + supplementCount = ( + row["supplementCount"] + 1 + if isSupplement + else row["supplementCount"] + ) + await cls.getDB().execute( + """ + UPDATE userSignSummary + SET totalSignDays=totalSignDays+1, + currentMonth=?, + monthSignDays=?, + lastSignDate=?, + continuousDays=?, + supplementCount=? + WHERE uid=? + """, + ( + currentMonth, + monthSignDays, + signDate, + continuousDays, + supplementCount, + uid, + ), + ) + else: + monthSignDays = 1 + await cls.getDB().execute( + """ + INSERT INTO userSignSummary + (uid, totalSignDays, currentMonth, monthSignDays, lastSignDate, continuousDays, supplementCount) + VALUES (?, ?, ?, ?, ?, ?, ?) + """, + ( + uid, + 1, + currentMonth, + monthSignDays, + signDate, + 1, + 1 if isSupplement else 0, + ), + ) + + # 计算累签奖励 + reward = sign["continuou"].get(f"{monthSignDays}", None) + if reward: + point += reward.get("point", 0) + exp += reward.get("exp", 0) + vipPoint = reward.get("vipPoint", 0) + + plant = reward.get("plant", {}) + if plant: + for key, value in plant.items(): + await cls.getUserSeedManager().addUserSeedByUid(uid, key, value) + + if config.g_bIsDebug: + exp += 9999 + + # 向数据库更新 + await player.addExp(exp) + await player.addPoint("point", point) + + if vipPoint > 0: + await player.addPoint("vipPoint", vipPoint) + + return 1 + except Exception as e: + logger.warning("执行签到失败", e=e) + return 0 + + @classmethod + async def drawSignCalendarImage(cls, uid: str, year: int, month: int): + # 绘制签到图,自动提取数据库中该用户该月的签到天数 + cellSize = 80 + padding = 40 + titleHeight = 80 + cols = 7 + rows = 6 + width = cellSize * cols + padding * 2 + height = cellSize * rows + padding * 2 + titleHeight + + img = BuildImage(width, height, color=(255, 255, 255)) + await img.text((padding, 20), f"{year}年{month}月签到表", font_size=36) + + firstWeekday, totalDays = calendar.monthrange(year, month) + monthStr = f"{year:04d}-{month:02d}" + try: + sql = "SELECT signDate FROM userSignLog WHERE uid=? AND signDate LIKE ?" + async with cls.getDB().execute(sql, (uid, f"{monthStr}-%")) as cursor: + rows = await cursor.fetchall() + signedDays = {int(r[0][-2:]) for r in rows if r[0][-2:].isdigit()} + except Exception as e: + logger.warning("绘制签到图时数据库查询失败", e=e) + signedDays = set() + + for day in range(1, totalDays + 1): + index = day + firstWeekday - 1 + row = index // cols + col = index % cols + x1 = padding + col * cellSize + y1 = padding + titleHeight + row * cellSize + x2 = x1 + cellSize - 10 + y2 = y1 + cellSize - 10 + color = (112, 196, 112) if day in signedDays else (220, 220, 220) + await img.rectangle((x1, y1, x2, y2), fill=color, outline="black", width=2) + await img.text((x1 + 10, y1 + 10), str(day), font_size=24) + + return img diff --git a/legacy/zhenxun_plugin_farm/core/database/userSoil.py b/legacy/zhenxun_plugin_farm/core/database/userSoil.py new file mode 100644 index 0000000..379bf5f --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userSoil.py @@ -0,0 +1,569 @@ +import math +import re + +from zhenxun.services.log import logger + +from ...utils import config, getToolManager +from .database import CSqlManager + + +class CUserSoilDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userSoil" + + async def initDB(self): + userSoil = { + "uid": "TEXT NOT NULL", + "soilIndex": "INTEGER NOT NULL", # 地块索引从1开始 + "plantName": "TEXT DEFAULT ''", # 作物名称 + "plantTime": "INTEGER DEFAULT 0", # 播种时间 + "matureTime": "INTEGER DEFAULT 0", # 成熟时间 + "soilLevel": "INTEGER DEFAULT 0", # 土地等级 0=普通地,1=红土地,2=黑土地,3=金土地 + "wiltStatus": "INTEGER DEFAULT 0", # 枯萎状态 0=未枯萎,1=枯萎 + "fertilizerStatus": "INTEGER DEFAULT 0", # 施肥状态 0=未施肥,1=施肥 2=增肥 + "bugStatus": "INTEGER DEFAULT 0", # 虫害状态 0=无虫害,1=有虫害 + "weedStatus": "INTEGER DEFAULT 0", # 杂草状态 0=无杂草,1=有杂草 + "waterStatus": "INTEGER DEFAULT 0", # 缺水状态 0=不缺水,1=缺水 + "harvestCount": "INTEGER DEFAULT 0", # 收获次数 + "isSoilPlanted": "INTEGER DEFAULT NULL", # 是否种植作物 0=没有,1=有 + "PRIMARY KEY": "(uid, soilIndex)", + } + + await self.ensureTableSchema("userSoil", userSoil) + self.setInitialized() + + @classmethod + async def nextPhase(cls, uid: str, soilIndex: int): + """将指定地块的作物进入下个阶段 + + Args: + soilIndex (int): 地块索引 从1开始 + """ + if not config.g_bIsDebug: + return + + soilInfo = await cls.getUserSoil(uid, soilIndex) + + if not soilInfo: + return + + plantInfo = await cls.getPlantManager().getPlantByName(soilInfo["plantName"]) + + if not plantInfo: + return + + currentTime = getToolManager().dateTime().now().timestamp() + phaseList = await cls.getPlantManager().getPlantPhaseByName( + soilInfo["plantName"] + ) + + if currentTime >= soilInfo["matureTime"]: + return + + elapsedTime = currentTime - soilInfo["plantTime"] + currentStage = currentStage = sum(1 for thr in phaseList if elapsedTime >= thr) + + t = int(soilInfo["plantTime"]) - phaseList[currentStage] + s = int(soilInfo["matureTime"]) - phaseList[currentStage] + + await cls.updateUserSoilFields( + uid, soilIndex, {"plantTime": t, "matureTime": s} + ) + + logger.debug( + f"当前阶段{currentStage}, 阶段时间{phaseList[currentStage]}, 播种时间{t}, 收获时间{s}" + ) + + @classmethod + async def matureNow(cls, uid: str, soilIndex: int): + """将指定地块的作物直接成熟 + + Args: + uid (str): 用户ID + soilIndex (int): 地块索引(从1开始) + """ + # 与 nextPhase 不同:无需调试模式检查,允许在任何模式下调用 + soilInfo = await cls.getUserSoil(uid, soilIndex) + if not soilInfo: + return + + plantName = soilInfo.get("plantName") + if not plantName: + return + + plantInfo = await cls.getPlantManager().getPlantByName(plantName) + if not plantInfo: + return + + currentTime = int(getToolManager().dateTime().now().timestamp()) + # 如果当前时间已经超过或等于成熟时间,则作物已成熟或可收获 + if currentTime >= soilInfo["matureTime"]: + return + + # 将作物成熟时间直接更新为当前时间,实现立即成熟 + await cls.updateUserSoilFields(uid, soilIndex, {"matureTime": currentTime}) + + @classmethod + async def getUserFarmByUid(cls, uid: str) -> dict: + """获取指定用户的旧农场数据 + + Args: + uid (str): 用户ID + + Returns: + dict: 包含字段名-值的字典; 若无数据则返回空字典 + """ + cursor = await cls.getDB().execute("SELECT * FROM soil WHERE uid = ?", (uid,)) + row = await cursor.fetchone() + + if not row: + return {} + columns = [description[0] for description in cursor.description] + return dict(zip(columns, row)) + + @classmethod + async def insertUserSoil(cls, soilInfo: dict): + """插入一条新的 userSoil 记录 + + Args: + soilInfo (dict): 新土地数据 + + Returns: + None + """ + async with cls._transaction(): + await cls.getDB().execute( + """ + INSERT INTO userSoil + (uid, soilIndex, plantName, plantTime, matureTime, + soilLevel, wiltStatus, fertilizerStatus, bugStatus, + weedStatus, waterStatus, harvestCount, isSoilPlanted) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?) + """, + ( + soilInfo["uid"], + soilInfo["soilIndex"], + soilInfo.get("plantName", ""), + soilInfo.get("plantTime", 0), + soilInfo.get("matureTime", 0), + soilInfo.get("soilLevel", 0), + soilInfo.get("wiltStatus", 0), + soilInfo.get("fertilizerStatus", 0), + soilInfo.get("bugStatus", 0), + soilInfo.get("weedStatus", 0), + soilInfo.get("waterStatus", 0), + soilInfo.get("harvestCount", 0), + soilInfo.get("isSoilPlanted", 0), + ), + ) + + @classmethod + async def _insertUserSoil(cls, soilInfo: dict): + """插入一条新的 userSoil 记录 + + Args: + soilInfo (dict): 新土地数据 + + Returns: + None + """ + await cls.getDB().execute( + """ + INSERT INTO userSoil + (uid, soilIndex, plantName, plantTime, matureTime, + soilLevel, wiltStatus, fertilizerStatus, bugStatus, + weedStatus, waterStatus, harvestCount, isSoilPlanted) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?) + """, + ( + soilInfo["uid"], + soilInfo["soilIndex"], + soilInfo.get("plantName", ""), + soilInfo.get("plantTime", 0), + soilInfo.get("matureTime", 0), + soilInfo.get("soilLevel", 0), + soilInfo.get("wiltStatus", 0), + soilInfo.get("fertilizerStatus", 0), + soilInfo.get("bugStatus", 0), + soilInfo.get("weedStatus", 0), + soilInfo.get("waterStatus", 0), + soilInfo.get("harvestCount", 0), + soilInfo.get("isSoilPlanted", 0), + ), + ) + + @classmethod + async def getUserSoil(cls, uid: str, soilIndex: int) -> dict: + """获取指定用户某块土地的详细信息 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + + Returns: + dict: 记录存在返回字段-值字典,否则返回 None + """ + async with cls._transaction(): + cursor = await cls.getDB().execute( + "SELECT * FROM userSoil WHERE uid = ? AND soilIndex = ?", + (uid, soilIndex), + ) + row = await cursor.fetchone() + if not row: + return {} + columns = [description[0] for description in cursor.description] + return dict(zip(columns, row)) + + @classmethod + async def _getUserSoil(cls, uid: str, soilIndex: int) -> dict | None: + """获取指定用户某块土地的详细信息 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + + Returns: + dict | None: 记录存在返回字段-值字典,否则返回 None + """ + cursor = await cls.getDB().execute( + "SELECT * FROM userSoil WHERE uid = ? AND soilIndex = ?", + (uid, soilIndex), + ) + row = await cursor.fetchone() + if not row: + return None + columns = [description[0] for description in cursor.description] + return dict(zip(columns, row)) + + @classmethod + async def countSoilByLevel(cls, uid: str, soilLevel: int) -> int: + """统计指定用户在指定土地等级的土地数量 + + Args: + uid (str): 用户ID + soilLevel (int): 土地等级 + + Returns: + int: 符合条件的土地数量 + """ + async with cls._transaction(): + cursor = await cls.getDB().execute( + "SELECT COUNT(*) FROM userSoil WHERE uid = ? AND soilLevel = ?", + (uid, soilLevel), + ) + row = await cursor.fetchone() + return row[0] if row else 0 + + @classmethod + async def updateUserSoil(cls, uid: str, soilIndex: int, field: str, value): + """更新指定用户土地的单个字段 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + field (str): 需更新的字段名 + value: 新值 + + Returns: + None + """ + async with cls._transaction(): + await cls.getDB().execute( + f"UPDATE userSoil SET {field} = ? WHERE uid = ? AND soilIndex = ?", + (value, uid, soilIndex), + ) + + @classmethod + async def _updateUserSoil(cls, uid: str, soilIndex: int, field: str, value): + """更新指定用户土地的单个字段 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + field (str): 需更新的字段名 + value: 新值 + + Returns: + None + """ + await cls.getDB().execute( + f"UPDATE userSoil SET {field} = ? WHERE uid = ? AND soilIndex = ?", + (value, uid, soilIndex), + ) + + @classmethod + async def updateUserSoilFields( + cls, uid: str, soilIndex: int, updates: dict + ) -> bool: + """批量更新指定用户土地的多个字段 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + updates (dict): 字段-新值的字典 + + Returns: + bool: 如果无可更新字段则返回 False,否则更新成功返回 True + """ + # 允许更新的列白名单 + allowedFields = { + "plantName", + "plantTime", + "matureTime", + "soilLevel", + "wiltStatus", + "fertilizerStatus", + "bugStatus", + "weedStatus", + "waterStatus", + "harvestCount", + "isSoilPlanted", + } + setClauses = [] + values = [] + for field, value in updates.items(): + if field not in allowedFields: + continue + setClauses.append(f'"{field}" = ?') + values.append(value) + if not setClauses: + return False + + values.extend([uid, soilIndex]) + sql = f"UPDATE userSoil SET {', '.join(setClauses)} WHERE uid = ? AND soilIndex = ?" + + try: + async with cls._transaction(): + await cls.getDB().execute(sql, tuple(values)) + return True + except Exception as e: + logger.error(f"批量更新土地字段失败: {e}") + return False + + @classmethod + async def deleteUserSoil(cls, uid: str, soilIndex: int): + """删除指定用户的土地记录 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + + Returns: + None + """ + async with cls._transaction(): + await cls.getDB().execute( + "DELETE FROM userSoil WHERE uid = ? AND soilIndex = ?", (uid, soilIndex) + ) + + @classmethod + async def _deleteUserSoil(cls, uid: str, soilIndex: int): + """删除指定用户的土地记录 + + Args: + uid (str): 用户ID + soilIndex (int): 土地索引 + + Returns: + None + """ + await cls.getDB().execute( + "DELETE FROM userSoil WHERE uid = ? AND soilIndex = ?", (uid, soilIndex) + ) + + @classmethod + async def sowingByPlantName(cls, uid: str, soilIndex: int, plantName: str) -> bool: + """播种指定作物到用户土地区 + + Args: + uid (str): 用户ID + soilIndex (int): 土地区索引 + plantName (str): 植物名 + + Returns: + bool: 播种成功返回 True,否则返回 False + """ + # 校验土地区是否已种植 + soilInfo = await cls.getUserSoil(uid, soilIndex) + if soilInfo and soilInfo.get("plantName"): + return False + + # 获取植物配置""" """ + plantCfg = await cls.getPlantManager().getPlantByName(plantName) + if not plantCfg: + logger.error(f"未知植物: {plantName}") + return False + + nowTs = int(getToolManager().dateTime().now().timestamp()) + + time = int(plantCfg.get("time", 0)) + percent = await cls.getSoilLevelTime(soilInfo.get("soilLevel", 0)) + + # 处理土地等级带来的时间缩短 + time = math.floor(time * (100 + percent) // 100) + + matureTs = nowTs + time * 3600 + + try: + async with cls._transaction(): + prev = soilInfo or {} + await cls._deleteUserSoil(uid, soilIndex) + # 根据此植物收获次数对其星级进行升级 + # 为避免对已带星级前缀的作物重复添加前缀,先提取基础名称 + base_name = plantName + m = re.match(r"^(?:一星|二星|三星|四星|五星)", plantName) + if m: + base_name = plantName[len(m.group(0)) :] + + # 只有当存在一星升级配置时才尝试按收获次数升级 + if await cls.getPlantManager().existsPlant("一星" + base_name): + harvestCounts = await cls.getUserPlantCountManager().getUserPlantCountByPlantName( + uid, base_name + ) + # 根据阈值设定最高星级(避免重复拼接) + prefix = "" + if harvestCounts >= 1200: + prefix = "三星" + elif harvestCounts >= 700: + prefix = "二星" + elif harvestCounts >= 350: + prefix = "一星" + + plantName = prefix + base_name if prefix else base_name + + await cls._insertUserSoil( + { + "uid": uid, + "soilIndex": soilIndex, + "plantName": plantName, + "plantTime": nowTs, + "matureTime": matureTs, + "soilLevel": prev.get("soilLevel", 0), + "wiltStatus": 0, + "fertilizerStatus": 0, + "bugStatus": 0, + "weedStatus": 0, + "waterStatus": 0, + "harvestCount": 0, + "isSoilPlanted": 1, + } + ) + return True + except Exception as e: + logger.error("播种失败!", e=e) + return False + + @classmethod + async def getUserSoilStatus(cls, uid: str, soilIndex: int) -> str: + status = [] + soilInfo = await cls.getUserSoilManager().getUserSoil(uid, soilIndex) + + if not soilInfo: + return "" + + if soilInfo.get("wiltStatus", 0) == 1: + return "枯萎" + + if soilInfo.get("fertilizerStatus", 0) == 1: + status.append("施肥") + elif soilInfo.get("fertilizerStatus", 0) == 2: + status.append("增肥") + + if soilInfo.get("bugStatus", 0) == 1: + status.append("虫害") + + if soilInfo.get("weedStatus", 0) == 1: + status.append("杂草") + + if soilInfo.get("waterStatus", 0) == 1: + status.append("缺水") + + return ",".join(status) + + @classmethod + async def getSoilLevel(cls, level: int) -> str: + """获取土地等级英文文本 + + Args: + level (int): 土地等级 + + Returns: + str: + """ + if level == 1: + return "red" + elif level == 2: + return "black" + elif level == 3: + return "gold" + + return "default" + + @classmethod + async def getSoilLevelText(cls, level: int) -> str: + """获取土地等级中文文本 + + Args: + level (int): 土地等级 + + Returns: + str: + """ + if level == 1: + return "红土地" + elif level == 2: + return "黑土地" + elif level == 3: + return "金土地" + + return "草土地" + + @classmethod + async def getSoilLevelHarvestNumber(cls, level: int) -> int: + """获取土地等级收获数量增加比例 + + Args: + level (int): 土地等级 + + Returns: + int: + """ + if level == 2: + return 20 + elif level == 3: + return 28 + + return 10 + + @classmethod + async def getSoilLevelHarvestExp(cls, level: int) -> int: + """获取土地等级收获经验增加比例 + + Args: + level (int): 土地等级 + + Returns: + int: + """ + if level == 3: + return 28 + + return 0 + + @classmethod + async def getSoilLevelTime(cls, level: int) -> int: + """获取土地等级播种减少时间消耗 + + Args: + level (int): 土地等级 + + Returns: + int: + """ + if level == 2: + return 20 + elif level == 3: + return 20 + + return 0 diff --git a/legacy/zhenxun_plugin_farm/core/database/userSteal.py b/legacy/zhenxun_plugin_farm/core/database/userSteal.py new file mode 100644 index 0000000..474c0f0 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/database/userSteal.py @@ -0,0 +1,226 @@ +from zhenxun.services.log import logger + +from .database import CSqlManager + + +class CUserStealDB(CSqlManager): + def __init__(self): + super().__init__() + self.m_sTableName = "userSteal" + + async def initDB(self): + userSteal = { + "uid": "TEXT NOT NULL", # 被偷用户Uid + "soilIndex": "INTEGER NOT NULL", # 被偷的地块索引 从1开始 + "stealerUid": "TEXT NOT NULL", # 偷菜用户Uid + "stealCount": "INTEGER NOT NULL", # 被偷数量 + "stealTime": "INTEGER NOT NULL", # 被偷时间 + "PRIMARY KEY": "(uid, soilIndex, stealerUid)", + } + await self.ensureTableSchema("userSteal", userSteal) + self.setInitialized() + + @classmethod + async def addStealRecord( + cls, uid: str, soilIndex: int, stealerUid: str, stealCount: int, stealTime: int + ) -> bool: + """添加偷菜记录 + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + stealerUid (str): 偷菜用户Uid + stealCount (int): 被偷数量 + stealTime (int): 被偷时间(时间戳) + + Returns: + bool: 操作是否成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + 'INSERT INTO "userSteal"(uid, soilIndex, stealerUid, stealCount, stealTime) VALUES(?, ?, ?, ?, ?);', + (uid, soilIndex, stealerUid, stealCount, stealTime), + ) + return True + except Exception as e: + logger.warning("添加偷菜记录失败", e=e) + return False + + @classmethod + async def getStealRecordsByUid(cls, uid: str) -> dict: + """根据用户Uid获取所有偷菜记录 + + Args: + uid (str): 被偷用户Uid + + Returns: + list: 偷菜记录字典列表,每条包含 soilIndex, stealerUid, stealCount, stealTime + """ + try: + async with cls._transaction(): + cursor = await cls.getDB().execute( + 'SELECT soilIndex, stealerUid, stealCount, stealTime FROM "userSteal" WHERE uid=?;', + (uid,), + ) + row = await cursor.fetchone() + + if not row: + return {} + + result = dict(row) + return result + except Exception as e: + logger.warning("获取偷菜记录失败", e=e) + return {} + + @classmethod + async def getStealRecord(cls, uid: str, soilIndex: int) -> list: + """获取指定地块的所有偷菜记录 + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + + Returns: + list: 偷菜记录字典列表,每条包含 stealerUid, stealCount, stealTime + """ + try: + async with cls._transaction(): + cursor = await cls.getDB().execute( + 'SELECT stealerUid, stealCount, stealTime FROM "userSteal" WHERE uid=? AND soilIndex=?;', + (uid, soilIndex), + ) + rows = await cursor.fetchall() + return [ + { + "uid": uid, + "soilIndex": soilIndex, + "stealerUid": row[0], + "stealCount": row[1], + "stealTime": row[2], + } + for row in rows + ] + except Exception as e: + logger.warning("获取单地块偷菜记录失败", e=e) + return [] + + @classmethod + async def getTotalStolenCount(cls, uid: str, soilIndex: int) -> int: + """计算指定地块被偷的总数量(所有用户偷取数量之和) + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + + Returns: + int: 被偷的总数量,如果无记录则返回 0 + """ + try: + async with cls._transaction(): + cursor = await cls.getDB().execute( + 'SELECT SUM(stealCount) FROM "userSteal" WHERE uid=? AND soilIndex=?;', + (uid, soilIndex), + ) + row = await cursor.fetchone() + return row[0] or 0 # type: ignore + except Exception as e: + logger.warning("计算总偷菜数量失败", e=e) + return 0 + + @classmethod + async def getStealerCount(cls, uid: str, soilIndex: int) -> int: + """计算指定地块被多少人偷过(不同偷菜用户数量) + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + + Returns: + int: 偷菜者总数,如果无记录则返回 0 + """ + try: + async with cls._transaction(): + cursor = await cls.getDB().execute( + 'SELECT COUNT(DISTINCT stealerUid) FROM "userSteal" WHERE uid=? AND soilIndex=?;', + (uid, soilIndex), + ) + row = await cursor.fetchone() + return row[0] or 0 # type: ignore + except Exception as e: + logger.warning("计算偷菜者数量失败", e=e) + return 0 + + @classmethod + async def hasStealed(cls, uid: str, soilIndex: int, stealerUid: str) -> bool: + """判断指定用户是否曾偷取过该地块 + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + stealerUid (str): 偷菜用户Uid + + Returns: + bool: 若存在记录返回 True,否则返回 False + """ + try: + async with cls._transaction(): + cursor = await cls.getDB().execute( + 'SELECT 1 FROM "userSteal" WHERE uid=? AND soilIndex=? AND stealerUid=? LIMIT 1;', + (uid, soilIndex, stealerUid), + ) + row = await cursor.fetchone() + return bool(row) + except Exception as e: + logger.warning("检查偷菜记录失败", e=e) + return False + + @classmethod + async def updateStealRecord( + cls, uid: str, soilIndex: int, stealerUid: str, stealCount: int, stealTime: int + ) -> bool: + """更新偷菜记录的数量和时间 + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + stealerUid (str): 偷菜用户Uid + stealCount (int): 新的偷菜数量 + stealTime (int): 新的偷菜时间(时间戳) + + Returns: + bool: 操作是否成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + 'UPDATE "userSteal" SET stealCount=?, stealTime=? WHERE uid=? AND soilIndex=? AND stealerUid=?;', + (stealCount, stealTime, uid, soilIndex, stealerUid), + ) + return True + except Exception as e: + logger.warning("更新偷菜记录失败", e=e) + return False + + @classmethod + async def deleteStealRecord(cls, uid: str, soilIndex: int) -> bool: + """删除指定偷菜记录(只需被偷用户Uid和地块索引) + + Args: + uid (str): 被偷用户Uid + soilIndex (int): 被偷地块索引 + + Returns: + bool: 删除是否成功 + """ + try: + async with cls._transaction(): + await cls.getDB().execute( + 'DELETE FROM "userSteal" WHERE uid=? AND soilIndex=?;', + (uid, soilIndex), + ) + return True + except Exception as e: + logger.warning("删除偷菜记录失败", e=e) + return False diff --git a/legacy/zhenxun_plugin_farm/core/dbService.py b/legacy/zhenxun_plugin_farm/core/dbService.py new file mode 100644 index 0000000..d1f63d6 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/dbService.py @@ -0,0 +1,115 @@ +import asyncio +from typing import Any + +from zhenxun.services.log import logger + +from .database import ( + CPlantManager, + CUserDB, + CUserItemDB, + CUserPlantCountDB, + CUserPlantDB, + CUserSeedDB, + CUserSignDB, + CUserSoilDB, + CUserStealDB, + g_pDBlocator, +) + + +class CDBService: + """ + 数据库服务管理器 + 负责初始化和协调所有数据库服务 + """ + + def __init__(self): + self.m_manager: dict[str, Any] = {} + self.m_bInitialized = False + + async def init(self): + if self.m_bInitialized: + logger.warning("真寻农场数据库服务已初始化") + return + + m_manager = { + "plant": CPlantManager(), + "user": CUserDB(), + "userSoil": CUserSoilDB(), + "userPlant": CUserPlantDB(), + "userSeed": CUserSeedDB(), + "userItem": CUserItemDB(), + "userSteal": CUserStealDB(), + "userSign": CUserSignDB(), + "userPlantCount": CUserPlantCountDB(), + } + + for name, manager in m_manager.items(): + g_pDBlocator.register(name, manager) + self.m_manager[name] = manager + + tasks = [] + for name, manager in self.m_manager.items(): + tasks.append(manager.init()) + tasks.append(manager.initDB()) + + await asyncio.gather(*tasks) + + g_pDBlocator.markInitialized() + self.m_bInitialized = True + + logger.debug("真寻农场数据库服务初始化完成") + + async def cleanup(self): + task = [] + + for manager in self.m_manager.values(): + if hasattr(manager, "cleanup"): + task.append(manager.cleanup()) + + await asyncio.gather(*task) + self.m_manager.clear() + self.m_bInitialized = False + + @property + def plant(self): + return self.m_manager["plant"] + + @property + def user(self): + return self.m_manager["user"] + + @property + def userSoil(self): + return self.m_manager["userSoil"] + + @property + def userPlant(self): + return self.m_manager["userPlant"] + + @property + def userSeed(self): + return self.m_manager["userSeed"] + + @property + def userItem(self): + return self.m_manager["userItem"] + + @property + def userSteal(self): + return self.m_manager["userSteal"] + + @property + def userSign(self): + return self.m_manager["userSign"] + + @property + def userPlantCount(self): + return self.m_manager["userPlantCount"] + + @property + def initialized(self) -> bool: + return self.m_bInitialized + + +g_pDBService = CDBService() diff --git a/legacy/zhenxun_plugin_farm/core/farm.py b/legacy/zhenxun_plugin_farm/core/farm.py new file mode 100644 index 0000000..b196c34 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/farm.py @@ -0,0 +1,891 @@ +import math +import random +import re + +from zhenxun.configs.config import Config +from zhenxun.models.user_console import UserConsole +from zhenxun.services.log import logger +from zhenxun.utils.enum import GoldHandle +from zhenxun.utils.image_utils import ImageTemplate + +from ..core.dbService import g_pDBService +from ..event import g_pEventManager +from ..utils import config, getJsonManager, getToolManager + + +class CFarmManager: + @classmethod + async def buyPointByUid(cls, uid: str, num: int) -> str: + if num <= 0: + return "你是怎么做到购买不是正数的农场币的" + + user = await UserConsole.get_user(uid) + + pro = float(Config.get_config("zhenxun_plugin_farm", "兑换倍数")) + tax = float(Config.get_config("zhenxun_plugin_farm", "手续费")) + + # 计算手续费 + fee = math.floor(num * tax) + # 实际扣费金额 + deduction = num + fee + + if user.gold < deduction: + return f"你的金币不足或不足承担手续费。当前手续费为{fee}" + + await UserConsole.reduce_gold( + uid, + num, + GoldHandle.PLUGIN, # type: ignore + "zhenxun_plugin_farm", + ) + await UserConsole.reduce_gold( + uid, + fee, + GoldHandle.PLUGIN, # type: ignore + "zhenxun_plugin_farm", + ) + + point = num * pro + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + await player.addPoint("point", int(point)) + + return f"充值{point}农场币成功,手续费{tax}金币,当前农场币:{player.user.get('point', 0)}" + + @classmethod + async def getUserSeedByUid(cls, uid: str) -> bytes: + """获取用户种子仓库""" + dataList = [] + columnNames = [ + "-", + "种子名称", + "数量", + "收获经验", + "收获数量", + "成熟时间(小时)", + "收获次数", + "是否可以上架交易行", + ] + + # 从数据库获取结构化数据 + seedRecords = await g_pDBService.userSeed.getUserSeedByUid(uid) or {} + + if not seedRecords: + result = await ImageTemplate.table_page( + "种子仓库", + "播种示例:@小真寻 播种 大白菜 [数量]", + columnNames, + dataList, + ) + return result.pic2bytes() + + for seedName, count in seedRecords.items(): + try: + plantInfo = await g_pDBService.plant.getPlantByName(seedName) + if not plantInfo: + continue + + iconPath = config.g_sResourcePath / f"plant/{seedName}/icon.png" + icon = (iconPath, 33, 33) if iconPath.exists() else "" + sellable = "可以" if plantInfo["sell"] else "不可以" + + dataList.append( + [ + icon, + seedName, + count, + plantInfo["experience"], + plantInfo["harvest"], + plantInfo["time"], + plantInfo["crop"], + sellable, + ] + ) + except KeyError: + continue + + result = await ImageTemplate.table_page( + "种子仓库", + "播种示例:@小真寻 播种 大白菜 [数量]", + columnNames, + dataList, + ) + return result.pic2bytes() + + @classmethod + async def sowing(cls, uid: str, name: str, num: int = -1) -> str: + """播种 + + Args: + uid (str): 用户Uid + name (str): 播种种子名称 + num (int, optional): 播种数量 + + Returns: + str: 返回结果 + """ + try: + # 获取用户的种子数量 + count = await g_pDBService.userSeed.getUserSeedByName(uid, name) + if count is None: + count = 0 # 如果返回 None,则视为没有种子 + + if count <= 0: + return config.g_sTranslation["sowing"]["noSeed"].format(name=name) + + # 如果播种数量超过仓库种子数量 + if count < num and num != -1: + return config.g_sTranslation["sowing"]["noNum"].format( + name=name, num=count + ) + + # 获取用户土地数量 + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + soilNumber = player.user.get("soil", 3) + + # 如果播种数量为 -1,表示播种所有可播种的土地 + if num == -1: + num = count + + # 发送播种前信号 + await g_pEventManager.m_beforePlant.emit(uid=uid, name=name, num=num) # type: ignore + + # 记录是否成功播种 + successCount = 0 + for i in range(1, soilNumber + 1): + if count > 0 and num > 0: + success = await g_pDBService.userSoil.sowingByPlantName( + uid, i, name + ) + if success: + # 更新种子数量 + num -= 1 + count -= 1 + + # 记录种子消耗数量 + successCount += 1 + + # 发送播种后信号 + await g_pEventManager.m_afterPlant.emit( # type: ignore + uid=uid, name=name, soilIndex=i + ) + + # 确保用户仓库数量更新 + if successCount > 0: + await g_pDBService.userSeed.updateUserSeedByName(uid, name, count) + + # 根据播种结果给出反馈 + if num == 0: + return config.g_sTranslation["sowing"]["success"].format( + name=name, num=count + ) + else: + return config.g_sTranslation["sowing"]["success2"].format( + name=name, num=count + ) + + except Exception as e: + logger.warning("播种操作失败!", e=e) + return config.g_sTranslation["sowing"]["error"] + + @classmethod + async def harvest(cls, uid: str) -> str: + """收获作物 + + Args: + uid (str): 用户Uid + + Returns: + str: 返回 + """ + try: + await g_pEventManager.m_beforeHarvest.emit(uid=uid) # type: ignore + + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + soilNumber = player.user.get("soil", 3) + + harvestRecords = [] # 收获日志记录 + experience = 0 # 总经验值 + harvestCount = 0 # 成功收获数量 + + for i in range(1, soilNumber + 1): + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, i) + if not soilInfo: + continue + + # 如果没有种植 + if soilInfo.get("isSoilPlanted", 1) == 0: + continue + + level = soilInfo.get("soilLevel", 0) + + # 如果是枯萎状态 + if soilInfo.get("wiltStatus", 1) == 1: + continue + + plantInfo = await g_pDBService.plant.getPlantByName( + soilInfo["plantName"] + ) + if not plantInfo: + continue + + currentTime = getToolManager().dateTime().now() + matureTime = ( + getToolManager() + .dateTime() + .fromtimestamp(int(soilInfo["matureTime"])) + ) + + if currentTime >= matureTime: + number = plantInfo["harvest"] + + # 处理偷菜扣除数量 + stealNum = await g_pDBService.userSteal.getTotalStolenCount(uid, i) + number -= stealNum + + # 处理土地等级带来的数量增长 向下取整 + percent = await g_pDBService.userSoil.getSoilLevelHarvestNumber( + level + ) + number = math.floor(number * (100 + percent) // 100) + + if number <= 0: + continue + + harvestCount += 1 + experience += plantInfo["experience"] + + # 处理土地等级带来的经验增长 向下取整 + percent = await g_pDBService.userSoil.getSoilLevelHarvestExp(level) + experience = math.floor(experience * (100 + percent) // 100) + + harvestRecords.append( + config.g_sTranslation["harvest"]["append"].format( + name=soilInfo["plantName"], + num=number, + exp=plantInfo["experience"], + ) + ) + + await g_pDBService.userPlant.addUserPlantByUid( + uid, soilInfo["plantName"], number + ) + + # 统计收获次数 + try: + # 处理星级前缀(只在前两字为 一星/二星/三星/四星/五星 时去掉前缀) + plant_name = soilInfo["plantName"] + m = re.match(r"^(?:一星|二星|三星|四星|五星)", plant_name) + if m: + plant_name = plant_name[len(m.group(0)) :] + + await g_pDBService.userPlantCount.addUserPlantCountByUid( + uid, plant_name + ) + except Exception: + # 忽略统计异常,避免影响主流程 + pass + + # 如果到达收获次数上限 + if soilInfo["harvestCount"] + 1 >= plantInfo["crop"]: + await g_pDBService.userSoil.updateUserSoil( + uid, i, "wiltStatus", 1 + ) + else: + phase = await g_pDBService.plant.getPlantPhaseByName( + soilInfo["plantName"] + ) + + ts, hc = ( + int(currentTime.timestamp()), + soilInfo["harvestCount"] + 1, + ) + p1, p2, *rest = phase + + await g_pDBService.userSoil.updateUserSoilFields( + uid, + i, + { + "harvestCount": hc, + "plantTime": ts - p1 - p2, + "matureTime": ts + p2 + sum(rest), + }, + ) + + await g_pEventManager.m_afterHarvest.emit( # type: ignore + uid=uid, name=soilInfo["plantName"], num=number, soilIndex=i + ) + + if experience > 0: + exp = player.user.get("exp", 0) + await player.addExp(exp + experience) + harvestRecords.append( + config.g_sTranslation["harvest"]["exp"].format( + exp=experience, + ) + ) + + if harvestCount <= 0: + return config.g_sTranslation["harvest"]["no"] + else: + return "\n".join(harvestRecords) + + except Exception as e: + logger.warning("收获操作失败!", e=e) + return config.g_sTranslation["harvest"]["error"] + + @classmethod + async def eradicate(cls, uid: str) -> str: + """铲除作物 + TODO 缺少随意铲除作物 目前只能铲除荒废作物 + Args: + uid (str): 用户Uid + + Returns: + str: 返回 + """ + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + soilNumber = player.user.get("soil", 3) + + await g_pEventManager.m_beforeEradicate.emit(uid=uid) # type: ignore + + experience = 0 + for i in range(1, soilNumber + 1): + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, i) + if not soilInfo: + continue + + # 如果没有种植 + if soilInfo.get("isSoilPlanted", 1) == 0: + continue + + # 如果不是枯萎状态 + if soilInfo.get("wiltStatus", 0) == 0: + continue + + experience += 3 + + if config.g_bIsDebug: + experience += 999 + + # 更新数据库操作 + await g_pDBService.userSoil.deleteUserSoil(uid, i) + + await g_pDBService.userSoil.updateUserSoilFields( + uid, + i, + { + "plantName": "", + "plantTime": 0, + "matureTime": 0, + "wiltStatus": 0, + "isSoilPlanted": 0, + }, + ) + + # 铲除作物会将偷菜记录清空 + await g_pDBService.userSteal.deleteStealRecord(uid, i) + + await g_pEventManager.m_afterEradicate.emit(uid=uid, soilIndex=i) # type: ignore + + if experience > 0: + exp = player.user.get("exp", 0) + await player.addExp(exp + experience) + + return config.g_sTranslation["eradicate"]["success"].format(exp=experience) + else: + return config.g_sTranslation["eradicate"]["error"] + + @classmethod + async def getUserPlantByUid(cls, uid: str) -> bytes: + """获取用户作物仓库 + + Args: + uid (str): 用户Uid + + Returns: + bytes: 返回图片 + """ + data_list = [] + column_name = [ + "-", + "作物名称", + "数量", + "单价", + "总价", + "是否上锁", + "是否可以上架交易行", + ] + + plant = await g_pDBService.userPlant.getUserPlantByUid(uid) + + if plant is None: + result = await ImageTemplate.table_page( + "作物仓库", + "出售示例:@小真寻 出售作物 大白菜 [数量]", + column_name, + data_list, + ) + return result.pic2bytes() + + sell = "" + for name, count in plant.items(): + plantInfo = await g_pDBService.plant.getPlantByName(name) + if not plantInfo: + continue + + icon = "" + icon_path = config.g_sResourcePath / f"plant/{name}/icon.png" + if icon_path.exists(): + icon = (icon_path, 33, 33) + + if plantInfo["sell"]: + sell = "可以" + else: + sell = "不可以" + + number = int(count) * plantInfo["price"] + + isLock = await g_pDBService.userPlant.checkPlantLockByName(uid, name) + if isLock: + lock = "上锁" + else: + lock = "未上锁" + + data_list.append( + [icon, name, count, plantInfo["price"], number, lock, sell] + ) + + result = await ImageTemplate.table_page( + "作物仓库", + "出售示例:@小真寻 出售作物 大白菜 [数量]", + column_name, + data_list, + ) + + return result.pic2bytes() + + @classmethod + async def lockUserPlantByUid(cls, uid: str, name: str, lock: int) -> str: + """加/解 锁用户作物 + + Args: + uid (str): 用户uid + name (str): 作物名称 + lock (int): 0=解锁 非0=加锁 + + Returns: + str: 返回 + """ + # 先判断该用户仓库是否有该作物 + if not await g_pDBService.userPlant.checkUserPlantByName(uid, name): + return config.g_sTranslation["lockPlant"]["noPlant"] + + # 更改加锁状态 + if await g_pDBService.userPlant.lockUserPlantByName(uid, name, lock): + if lock == 0: + return config.g_sTranslation["lockPlant"]["unlockPlant"].format( + name=name + ) + else: + return config.g_sTranslation["lockPlant"]["lockPlant"].format(name=name) + else: + return config.g_sTranslation["lockPlant"]["error"] + + @classmethod + async def stealing(cls, uid: str, target: str) -> str: + """偷菜 + + Args: + uid (str): 用户Uid + target (str): 被偷用户Uid + + Returns: + str: 返回 + """ + # 用户信息 + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + stealTime = player.user.get("stealTime", "") + stealCount = int(player.user["stealCount"]) + + if stealTime == "" or not stealTime: + stealTime = getToolManager().dateTime().date().today().strftime("%Y-%m-%d") + stealCount = 5 + elif ( + getToolManager().dateTime().date().fromisoformat(stealTime) + != getToolManager().dateTime().date().today() + ): + stealTime = getToolManager().dateTime().date().today().strftime("%Y-%m-%d") + stealCount = 5 + + if stealCount <= 0: + return config.g_sTranslation["stealing"]["max"] + + # 获取用户解锁地块数量 + soilNumber = player.user.get("soil", 3) + harvestRecords: list[str] = [] + isStealingNumber = 0 + isStealingPlant = 0 + + for i in range(1, soilNumber + 1): + soilInfo = await g_pDBService.userSoil.getUserSoil(target, i) + if not soilInfo: + continue + + # 如果没有种植 + if soilInfo.get("isSoilPlanted", 1) == 0: + continue + + # 如果是枯萎状态 + if soilInfo.get("wiltStatus", 1) == 1: + continue + + # 作物信息 + plantInfo = await g_pDBService.plant.getPlantByName(soilInfo["plantName"]) + if not plantInfo: + continue + + currentTime = getToolManager().dateTime().now() + matureTime = ( + getToolManager().dateTime().fromtimestamp(int(soilInfo["matureTime"])) + ) + + if currentTime >= matureTime: + # 如果偷过,则跳过该土地 + if await g_pDBService.userSteal.hasStealed(target, i, uid): + isStealingNumber += 1 + continue + + stealingNumber = plantInfo[ + "harvest" + ] - await g_pDBService.userSteal.getTotalStolenCount(target, i) + randomNumber = random.choice([1, 2]) + randomNumber = min(randomNumber, stealingNumber) + + if randomNumber > 0: + await g_pDBService.userPlant.addUserPlantByUid( + uid, soilInfo["plantName"], randomNumber + ) + + harvestRecords.append( + config.g_sTranslation["stealing"]["info"].format( + name=soilInfo["plantName"], num=randomNumber + ) + ) + + isStealingPlant += 1 + + # 如果将作物偷完,就直接更新状态 并记录用户偷取过 + if plantInfo["harvest"] - randomNumber + stealingNumber == 0: + # 如果作物 是最后一阶段作物且偷完 则直接枯萎 + if soilInfo["harvestCount"] + 1 >= plantInfo["crop"]: + await g_pDBService.userSoil.updateUserSoil( + target, i, "wiltStatus", 1 + ) + else: + phase = await g_pDBService.plant.getPlantPhaseByName( + soilInfo["plantName"] + ) + + ts, hc = ( + int(currentTime.timestamp()), + soilInfo["harvestCount"] + 1, + ) + p1, p2, *rest = phase + + await g_pDBService.userSoil.updateUserSoilFields( + uid, + i, + { + "harvestCount": hc, + "plantTime": ts - p1 - p2, + "matureTime": ts + p2 + sum(rest), + }, + ) + + await g_pDBService.userSteal.addStealRecord( + target, + i, + uid, + randomNumber, + int(getToolManager().dateTime().now().timestamp()), + ) + + else: + await g_pDBService.userSteal.addStealRecord( + target, + i, + uid, + randomNumber, + int(getToolManager().dateTime().now().timestamp()), + ) + + if isStealingPlant <= 0 and isStealingNumber <= 0: + return config.g_sTranslation["stealing"]["noPlant"] + elif isStealingPlant <= 0 and isStealingNumber > 0: + return config.g_sTranslation["stealing"]["repeat"] + else: + stealCount -= 1 + + await player.updateStealCountByUid(uid, stealTime, stealCount) + + return "\n".join(harvestRecords) + + @classmethod + async def reclamationCondition(cls, uid: str) -> str: + """获取开垦条件 + + Args: + uid (str): 用户Uid + + Returns: + str: 返回条件文本信息 + """ + jLevel = await getJsonManager().getLevel() + rec = jLevel["reclamation"] + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + try: + if player.user["soil"] >= 30: + return config.g_sTranslation["reclamation"]["perfect"] + + rec = rec[f"{player.user['soil'] + 1}"] + + level = rec["level"] + point = rec["point"] + item = rec["item"] + + str = "" + if len(item) == 0: + str = config.g_sTranslation["reclamation"]["next"].format( + level=level, num=point + ) + else: + str = config.g_sTranslation["reclamation"]["next2"].format( + level=level, num=point, item=item + ) + + return str + except Exception: + return config.g_sTranslation["reclamation"]["error"] + + @classmethod + async def reclamation(cls, uid: str) -> str: + """开垦 + + Args: + uid (str): 用户Uid + + Returns: + str: _description_ + """ + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + level = await player.getUserLevel() + + jsonLevel = await getJsonManager().getLevel() + rec = jsonLevel["reclamation"] + + try: + if player.user["soil"] >= 30: + return config.g_sTranslation["reclamation"]["perfect"] + + rec = rec[f"{player.user['soil'] + 1}"] + + levelFileter = rec["level"] + point = rec["point"] + # item = rec["item"] + + if level[0] < levelFileter: + return config.g_sTranslation["reclamation"]["nextLevel"].format( + level=level[0], next=levelFileter + ) + + if player.user["point"] < point: + return config.g_sTranslation["reclamation"]["noNum"].format(num=point) + + # TODO 缺少判断消耗的item + await player.subPoint("point", point) + await player.updateField("soil", player.user["soil"] + 1) + + return config.g_sTranslation["reclamation"]["success"] + except Exception: + return config.g_sTranslation["reclamation"]["error1"] + + @classmethod + async def soilUpgradeCondition(cls, uid: str, soilIndex: int) -> str: + """获取土地升级条件 + + Args: + uid (str): 用户Uid + soilIndex (str): 土地索引 + + Returns: + str: 返回土地升级条件 + """ + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, soilIndex) + + if not soilInfo: + return config.g_sTranslation["soilInfo"]["error"] + + soilLevel = soilInfo.get("soilLevel", 0) + 1 + if soilLevel >= config.g_iSoilLevelMax: + return config.g_sTranslation["soilInfo"]["error1"] + + # 获取用户当前土地 的下一级土地 数量 + countSoil = await g_pDBService.userSoil.countSoilByLevel(uid, soilLevel) + + # 获取升级所需 + soilLevelText = await g_pDBService.userSoil.getSoilLevel(soilLevel) + jSoil = await getJsonManager().getSoil() + fileter = jSoil["upgrade"][soilLevelText][countSoil] + + nextLevel = await g_pDBService.userSoil.getSoilLevelText(soilLevel) + + lines = ["将土地升级至:" + nextLevel + "。", "所需:"] + fields = [ + ("level", "等级"), + ("point", "金币"), + ("vipPoint", "点券"), + ] + for key, label in fields: + value = fileter.get(key, 0) + if value > 0: + lines.append(f"{label}:{value}") + + items = fileter.get("item", {}) + for name, qty in items.items(): + if qty: + lines.append(f"{name}:{qty}") + + lines.append("回复“是”将执行升级") + + return "\n".join(lines) + + @classmethod + async def soilUpgrade(cls, uid: str, soilIndex: int) -> str: + """土地升级 + + Args: + uid (str): 用户Uid + soilIndex (int): 土地索引 + + Returns: + str: + """ + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, soilIndex) + if not soilInfo: + return config.g_sTranslation["soilInfo"]["error"] + + soilLevel = soilInfo.get("soilLevel", 0) + 1 + if soilLevel >= config.g_iSoilLevelMax: + return config.g_sTranslation["soilInfo"]["error1"] + + countSoil = await g_pDBService.userSoil.countSoilByLevel(uid, soilLevel) + + soilLevelText = await g_pDBService.userSoil.getSoilLevel(soilLevel) + soil = await getJsonManager().getSoil() + fileter = soil["upgrade"][soilLevelText][countSoil] + + getters = { + "level": (await player.getUserLevel())[0], + "point": player.user.get("point", 0), + "vipPoint": player.user.get("vipPoint", 0), + } + + requirements = { + "level": "等级", + "point": "金币", + "vipPoint": "点券", + } + + for key, val in getters.items(): + need = fileter.get(key, 0) + if val < need: + return f"你的{requirements[key]}不够哦~" + + # 缺少item判断 + + # 更新数据库字段 + await g_pDBService.userSoil.updateUserSoil( + uid, soilIndex, "soilLevel", soilLevel + ) + + # 如果有作物的话直接成熟 + await g_pDBService.userSoil.matureNow(uid, soilIndex) + + # 更新数据库字段 + await player.subPoint("point", fileter.get("point", 0)) + await player.subPoint("vipPoint", fileter.get("vipPoint", 0)) + + return config.g_sTranslation["soilInfo"]["success"].format( + name=await g_pDBService.userSoil.getSoilLevelText(soilLevel), + text=config.g_sTranslation["soilInfo"][soilLevelText], + ) + + @classmethod + async def pointToVipPointByUid(cls, uid: str, num: int) -> str: + """点券兑换 + + Args: + uid (str): 用户Uid + num (int): 兑换点券数量 + + Returns: + str: 返回结果 + 兑换比例在配置文件中配置 + 目前配置文件中默认是20倍 + 100点券需要20000农场币 + 赠送点券规则: + 小于2000点券:0 + 2000-5000点券:100 + 5000-50000点券:280 + 大于50000点券:3000 + """ + if num < 100: + return "点券兑换数量必须大于等于100" + + pro = int(Config.get_config("zhenxun_plugin_farm", "点券兑换倍数")) + pro *= num + + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + point = player.user.get("point", 0) + if point < pro: + return f"你的农场币不足,当前农场币为{point},兑换还需要{pro - point}农场币" + + giftPoints: int + if num < 2000: + giftPoints = 0 + elif num < 5000: + giftPoints = 100 + elif num < 50000: + giftPoints = 280 + else: + giftPoints = 3000 + + number = num + giftPoints + await player.addPoint("vipPoint", number) + await player.subPoint("point", pro) + + return f"兑换{num}点券成功,当前点券:{number},赠送点券:{giftPoints},当前农场币:{point}" diff --git a/legacy/zhenxun_plugin_farm/core/help.py b/legacy/zhenxun_plugin_farm/core/help.py new file mode 100644 index 0000000..2cf5b90 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/help.py @@ -0,0 +1,35 @@ +from zhenxun.configs.path_config import DATA_PATH +from zhenxun.services.log import logger + +from ..utils import config, getToolManager + + +class CHelpManager: + @classmethod + async def createHelpImage(cls) -> bool: + templatePath = config.g_sResourcePath / "html/help.html" + outputPath = config.g_sResourcePath / "temp_html/help.html" + savePath = DATA_PATH / "farm_res/html/help.png" + + context = { + "main_title": "真寻农场帮助菜单", + "subtitle": "[]中为可选参数", + "page_title": "真寻农场帮助菜单", + "font_family": "MyFont", + "contents": [ + {"title": "主要指令", "commands": ["指令A", "指令B"]}, + {"title": "B", "commands": ["指令D", "指令E", "指令M", "指令i"]}, + ], + } + + try: + getToolManager().renderHtmlToFile(templatePath, context, outputPath) + + bytes = await getToolManager().screenshotSave( + str(outputPath), str(savePath), 1500, 2300 + ) + except Exception as e: + logger.warning("绘制农场帮助菜单失败", e=e) + return False + + return True diff --git a/legacy/zhenxun_plugin_farm/core/player/__init__.py b/legacy/zhenxun_plugin_farm/core/player/__init__.py new file mode 100644 index 0000000..d14668f --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/player/__init__.py @@ -0,0 +1,4 @@ +from .player import CPlayer +from .playerPool import CPlayerPool + +__all__ = ["CPlayer", "CPlayerPool"] diff --git a/legacy/zhenxun_plugin_farm/core/player/player.py b/legacy/zhenxun_plugin_farm/core/player/player.py new file mode 100644 index 0000000..d89d373 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/player/player.py @@ -0,0 +1,221 @@ +from .. import g_pDBlocator + + +class CPlayer: + def __init__(self): + self.user = { + "uid": "", # 用户Uid + "name": "", # 农场名称 + "exp": 0, # 经验值 + "point": 0, # 金币 + "vipPoint": 0, # 点券 + "soil": 3, # 解锁土地数量 + "stealTime": "", # 偷菜时间字符串 + "stealCount": 0, # 剩余偷菜次数 + } + + async def init(self, uid: str) -> bool: + self.user["uid"] = uid + return await self.loadFormDB() + + async def loadFormDB(self) -> bool: + uid = self.user.get("uid", "") + + if uid == "": + return False + + self.user = await g_pDBlocator.getUserManager().getUserInfoByUid(uid) + + return True + + async def isRegistered(self) -> bool: + """检查用户是否注册农场 + + Returns: + bool: 是否注册农场 + """ + uid = self.user.get("uid", "") + + if uid == "": + return False + + return await g_pDBlocator.getUserManager().isRegistered(uid) + + async def addPoint(self, type: str, index: int) -> bool: + """增加货币 + + Args: + type (str): 货币类型 point/vipPoint + index (int): 增加的数量 + + Returns: + bool: 是否成功增加货币 + """ + uid = self.user.get("uid", "") + + if uid == "" or type not in g_pDBlocator.getUserManager().currencies: + return False + + if index == 0: + return True + + nowIndex = self.user.get(type, 0) + index + + if nowIndex < 0: + nowIndex = 0 + + if await g_pDBlocator.getUserManager().updatePoint(uid, type, nowIndex): + self.user[type] = nowIndex + return True + + return False + + async def subPoint(self, type: str, index: int) -> bool: + """减少货币 + + Args: + type (str): 货币类型 point/vipPoint + index (int): 减少的数量 + + Returns: + bool: 是否成功减少货币 + """ + uid = self.user.get("uid", "") + + if uid == "" or type not in g_pDBlocator.getUserManager().currencies: + return False + + if index == 0: + return True + + nowIndex = self.user.get(type, 0) - index + + if nowIndex < 0: + nowIndex = 0 + + if await g_pDBlocator.getUserManager().updatePoint(uid, type, nowIndex): + self.user[type] = nowIndex + return True + + return False + + async def addExp(self, exp: int) -> bool: + """增加经验值 + + Args: + exp (int): 增加的经验值 + + Returns: + bool: 是否成功增加经验值 + """ + uid = self.user.get("uid", "") + + if uid == "": + return False + + if exp == 0: + return True + + nowExp = self.user.get("exp", 0) + exp + + if nowExp < 0: + nowExp = 0 + + if await g_pDBlocator.getUserManager().updateExp(uid, nowExp): + self.user["exp"] = nowExp + return True + + return False + + async def subExp(self, exp: int) -> bool: + """减少经验值 + + Args: + exp (int): 减少的经验值 + + Returns: + bool: 是否成功减少经验值 + """ + uid = self.user.get("uid", "") + + if uid == "": + return False + + if exp == 0: + return True + + nowExp = self.user.get("exp", 0) - exp + + if nowExp < 0: + nowExp = 0 + + if await g_pDBlocator.getUserManager().updateExp(uid, nowExp): + self.user["exp"] = nowExp + return True + + return False + + async def updateName(self, name: str) -> str: + """更新农场名称 + + Args: + name (str): 农场名称 + + Returns: + str: success/error/error1 + """ + uid = self.user.get("uid", "") + + if uid == "": + return "error" + + return await g_pDBlocator.getUserManager().updateName(uid, name) + + async def getUserLevel(self) -> tuple[int, int, int]: + """获取用户等级信息 + + Returns: + tuple[int, int, int]: 成功返回(当前等级, 升至下级还需经验, 当前等级已获经验) + 失败返回(-1, -1, -1) + """ + uid = self.user.get("uid", "") + + if uid == "": + return -1, -1, -1 + + return await g_pDBlocator.getUserManager().getUserLevelByUid(uid) + + async def updateStealCountByUid( + self, uid: str, stealTime: str, stealCount: int + ) -> bool: + """根据用户Uid更新剩余偷菜次数 + + Args: + uid (str): 用户Uid + stealTime (str): 偷菜日期 + stealCount (int): 新剩余偷菜次数 + + Returns: + bool: 是否更新成功 + """ + uid = self.user.get("uid", "") + + if uid == "": + return False + + return await g_pDBlocator.getUserManager().updateStealCountByUid( + uid, stealTime, stealCount + ) + + async def updateField(self, field: str, value) -> bool: + """更新单字段信息 + + Returns: + bool: 是否成功更新单字段信息 + """ + uid = self.user.get("uid", "") + + if uid == "": + return False + + return await g_pDBlocator.getUserManager().updateFieldByUid(uid, field, value) diff --git a/legacy/zhenxun_plugin_farm/core/player/playerPool.py b/legacy/zhenxun_plugin_farm/core/player/playerPool.py new file mode 100644 index 0000000..58f20e3 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/player/playerPool.py @@ -0,0 +1,212 @@ +import threading +import time +from typing import Any + +from zhenxun.services.log import logger + + +class CPlayerPool: + """ + 用户池管理类 + 管理用户对象的生命周期,支持自动清理超时用户 + """ + + def __init__(self, timeoutSeconds: int = 300, cleanupInterval: int = 3600): + """ + 初始化用户池 + + Args: + timeoutSeconds: 用户超时时间(秒),默认5分钟 + cleanupInterval: 清理间隔(秒),默认1小时 + """ + self._players: dict[str, dict[str, Any]] = {} + self._lock = threading.RLock() + self.timeoutSeconds = timeoutSeconds + self.cleanupInterval = cleanupInterval + + # 启动后台清理线程 + self._cleanupThread = threading.Thread(target=self._cleanupWorker, daemon=True) + self._running = True + self._cleanupThread.start() + + def createUser(self, uid: str, userObj: Any) -> bool: + """ + 创建并管理用户对象 + + Args: + uid: 用户ID + userObj: 用户对象 + + Returns: + bool: 是否创建成功 + """ + with self._lock: + if uid in self._players: + logger.debug(f"用户 {uid} 已存在,正在覆盖") + # 可以选择返回False或者覆盖,这里选择覆盖 + # return False + + self._players[uid] = { + "object": userObj, + "lastActive": time.time(), + "activeCount": 0, + } + logger.debug(f"用户 {uid} 创建并开始管理") + return True + + def getUser(self, uid: str) -> Any | None: + """ + 获取用户对象并刷新活跃时间 + + Args: + uid: 用户ID + + Returns: + Optional[Any]: 用户对象,如果不存在或已超时则返回None + """ + with self._lock: + userData = self._players.get(uid) + + if not userData: + logger.debug(f"用户 {uid} 不存在") + return None + + # 检查是否已超时(防御性检查) + currentTime = time.time() + if currentTime - userData["lastActive"] > self.timeoutSeconds: + logger.debug(f"用户 {uid} 在获取操作期间已超时") + self._removeUser(uid) + return None + + # 刷新活跃时间 + userData["lastActive"] = currentTime + userData["activeCount"] += 1 + + logger.debug(f"用户 {uid} 获取成功,活跃次数: {userData['activeCount']}") + return userData["object"] + + def updateUser(self, uid: str, userObj: Any) -> bool: + """ + 更新用户对象 + + Args: + uid: 用户ID + userObj: 新的用户对象 + + Returns: + bool: 是否更新成功 + """ + with self._lock: + if uid not in self._players: + logger.debug(f"用户 {uid} 不存在,无法更新") + return False + + self._players[uid]["object"] = userObj + self._players[uid]["lastActive"] = time.time() + logger.debug(f"用户 {uid} 更新成功") + return True + + def removeUser(self, uid: str) -> bool: + """ + 主动移除用户 + + Args: + uid: 用户ID + + Returns: + bool: 是否移除成功 + """ + with self._lock: + return self._removeUser(uid) + + def _removeUser(self, uid: str) -> bool: + """内部移除用户方法""" + if uid in self._players: + userData = self._players.pop(uid) + # 如果需要清理资源,可以在这里处理 + if hasattr(userData["object"], "close"): + try: + userData["object"].close() + except Exception as e: + logger.debug(f"关闭用户 {uid} 时出错: {e}") + + logger.debug(f"用户 {uid} 已移除,总活跃次数: {userData['activeCount']}") + return True + return False + + def _cleanupWorker(self): + """后台清理线程的工作函数""" + while self._running: + try: + self._cleanupExpiredUsers() + except Exception as e: + logger.debug(f"清理工作线程出错: {e}") + + # 休眠指定间隔 + time.sleep(self.cleanupInterval) + + def _cleanupExpiredUsers(self): + """清理超时用户""" + currentTime = time.time() + expiredUsers = [] + + # 首先收集过期的用户ID,避免在迭代中修改字典 + with self._lock: + for uid, userData in self._players.items(): + if currentTime - userData["lastActive"] > self.timeoutSeconds: + expiredUsers.append(uid) + + # 移除过期用户 + for uid in expiredUsers: + with self._lock: + # 再次检查,防止在收集和移除之间用户被更新 + if ( + uid in self._players + and currentTime - self._players[uid]["lastActive"] + > self.timeoutSeconds + ): + self._removeUser(uid) + + if expiredUsers: + logger.debug(f"已清理 {len(expiredUsers)} 个过期用户: {expiredUsers}") + + def getActiveUsers(self) -> dict[str, dict[str, Any]]: + """ + 获取当前活跃用户信息 + + Returns: + Dict: 用户信息字典 + """ + with self._lock: + # 返回副本避免外部修改 + return { + uid: { + "lastActive": data["lastActive"], + "activeCount": data["activeCount"], + "timeRemaining": self.timeoutSeconds + - (time.time() - data["lastActive"]), + } + for uid, data in self._players.items() + } + + def userCount(self) -> int: + """获取当前用户数量""" + with self._lock: + return len(self._players) + + def shutdown(self): + """关闭用户池,清理资源""" + self._running = False + if self._cleanupThread.is_alive(): + self._cleanupThread.join(timeout=5) + + # 清理所有用户 + with self._lock: + uids = list(self._players.keys()) + for uid in uids: + self._removeUser(uid) + + logger.debug("用户池关闭完成") + + +g_pUserPool = CPlayerPool() diff --git a/legacy/zhenxun_plugin_farm/core/shop.py b/legacy/zhenxun_plugin_farm/core/shop.py new file mode 100644 index 0000000..c446c37 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/core/shop.py @@ -0,0 +1,247 @@ +import math + +from zhenxun.utils.image_utils import ImageTemplate + +from ..utils import config, getToolManager +from . import g_pDBlocator + + +class CShopManager: + @classmethod + async def getSeedShopImage( + cls, filterKey: str | int = 1, num: int = 1, isVip: int = 0 + ) -> bytes: + """获取商店页面 + + Args: + filterKey (str|int): + - 字符串: 根据关键字筛选种子名称 + - 整数: 翻至对应页(无筛选) + num (int, optional): 当 filterKey 为字符串时,用于指定页码。Defaults to 1. + + Returns: + bytes: 返回商店图片bytes + """ + # 解析参数:区分筛选关键字和页码 + filterStr = None + if isinstance(filterKey, int): + page = filterKey + else: + filterStr = filterKey + page = num + + # 表头定义 + columnName = [ + "-", + "种子名称", + "农场币", + "解锁等级", + "果实单价", + "收获经验", + "收获数量", + "成熟时间(小时)", + "收获次数", + "是否可以上架交易行", + ] + + # 查询所有可购买作物,并根据筛选关键字过滤 + plants = await g_pDBlocator.getPlantManager().listPlants() + filteredPlants = [] + + # 如果是点券商店 + if isVip: + columnName[2] = "点券" + for plant in plants: + # 只留下点券购买的种子 + if plant["isVip"] == 0: + continue + # 跳过未解锁购买的种子 + if plant["isBuy"] == 0: + continue + # 字符串筛选 + if filterStr and filterStr not in plant["name"]: + continue + filteredPlants.append(plant) + else: + for plant in plants: + # 只留下农场币购买的种子 + if plant["isVip"] == 1: + continue + # 跳过未解锁购买的种子 + if plant["isBuy"] == 0: + continue + # 字符串筛选 + if filterStr and filterStr not in plant["name"]: + continue + filteredPlants.append(plant) + + # 计算分页 + totalCount = len(filteredPlants) + pageCount = math.ceil(totalCount / 15) if totalCount else 1 + startIndex = (page - 1) * 15 + pageItems = filteredPlants[startIndex : startIndex + 15] + + # 构建数据行 + dataList = [] + for plant in pageItems: + # 图标处理 + icon = "" + iconPath = config.g_sResourcePath / f"plant/{plant['name']}/icon.png" + if iconPath.exists(): + icon = (iconPath, 33, 33) + + # 交易行标记 + sell = "可以" if plant["sell"] else "不可以" + + dataList.append( + [ + icon, + plant["name"], # 种子名称 + plant["buy"], # 农场币种子单价 + plant["level"], # 解锁等级 + plant["price"], # 果实单价 + plant["experience"], # 收获经验 + plant["harvest"], # 收获数量 + plant["time"], # 成熟时间(小时) + plant["crop"], # 收获次数 + sell, # 是否可上架交易行 + ] + ) + if isVip: + dataList[-1][2] = plant["vipBuy"] # 点券种子单价 + + # 页码标题 + title = f"种子商店 页数: {page}/{pageCount}" + + # 渲染表格并返回图片bytes + result = await ImageTemplate.table_page( + title, + "购买示例:@小真寻 购买种子 大白菜 5", + columnName, + dataList, + ) + return result.pic2bytes() + + @classmethod + async def buySeed(cls, uid: str, name: str, num: int = 1) -> str: + """购买种子 + + Args: + uid (str): 用户Uid + name (str): 植物名称 + num (int, optional): 购买数量 + + Returns: + str: + """ + if num <= 0: + return config.g_sTranslation["buySeed"]["notNum"] + + player = await getToolManager().getPlayerByUid(uid) + plantInfo = await g_pDBlocator.getPlantManager().getPlantByName(name) + if not plantInfo or not player: + return config.g_sTranslation["buySeed"]["error"] + + level = player.user.get("level", 0) + + if level < int(plantInfo["level"]): + return config.g_sTranslation["buySeed"]["noLevel"] + + vipSeed = plantInfo.get("isVip", 0) == 1 + currencyType = "vipPoint" if vipSeed else "point" + price = int(plantInfo["vipBuy" if vipSeed else "buy"]) + totalCost = price * num + + currentCurrency = player.user.get(currencyType, 0) + if currentCurrency < totalCost: + return config.g_sTranslation["buySeed"][ + f"no{'Vip' if vipSeed else ''}Point" + ] + + await player.subPoint(currencyType, totalCost) + + if not await g_pDBlocator.getUserSeedManager().addUserSeedByUid(uid, name, num): + return config.g_sTranslation["buySeed"]["errorSql"] + + success_key = "vipSuccess" if vipSeed else "success" + remaining_currency = currentCurrency - totalCost + + return config.g_sTranslation["buySeed"][success_key].format( + name=name, total=totalCost, point=remaining_currency + ) + + @classmethod + async def sellPlantByUid(cls, uid: str, name: str = "", num: int = 1) -> str: + """出售作物 + + Args: + uid (str): 用户Uid + + Returns: + str: + """ + if not isinstance(name, str) or name.strip() == "": + name = "" + + plant = await g_pDBlocator.getUserPlantManager().getUserPlantByUid(uid) + if not plant: + return config.g_sTranslation["sellPlant"]["no"] + + point = 0 + totalSold = 0 + isAll = num == -1 + + if name == "": + for plantName, count in plant.items(): + isLock = await g_pDBlocator.getUserPlantManager().checkPlantLockByName( + uid, plantName + ) + + if isLock: + continue + + plantInfo = await g_pDBlocator.getUserPlantManager().getPlantByName( + plantName + ) + if not plantInfo: + continue + + point += plantInfo["price"] * count + await g_pDBlocator.getUserPlantManager().updateUserPlantByName( + uid, plantName, 0 + ) + else: + if name not in plant: + return config.g_sTranslation["sellPlant"]["error"].format(name=name) + available = plant[name] + sellAmount = available if isAll else min(available, num) + if sellAmount <= 0: + return config.g_sTranslation["sellPlant"]["error1"].format(name=name) + await g_pDBlocator.getUserPlantManager().updateUserPlantByName( + uid, name, available - sellAmount + ) + totalSold = sellAmount + + if name == "": + totalPoint = point + else: + plantInfo = await g_pDBlocator.getUserPlantManager().getPlantByName(name) + if not plantInfo: + price = 0 + else: + price = plantInfo["price"] + + totalPoint = totalSold * price + + player = await getToolManager().getPlayerByUid(uid) + if not player: + return config.g_sTranslation["basic"]["error"] + + currentPoint = player.user.get("point", 0) + await player.addPoint("point", currentPoint + totalPoint) + + result = "success1" if name == "" else "success" + + return config.g_sTranslation["sellPlant"][result].format( + point=totalPoint, num=currentPoint + totalPoint + ) diff --git a/legacy/zhenxun_plugin_farm/event/__init__.py b/legacy/zhenxun_plugin_farm/event/__init__.py new file mode 100644 index 0000000..60d34c5 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/event/__init__.py @@ -0,0 +1,3 @@ +from .event import g_pEventManager + +__all__ = ["g_pEventManager"] diff --git a/legacy/zhenxun_plugin_farm/event/event.py b/legacy/zhenxun_plugin_farm/event/event.py new file mode 100644 index 0000000..51b0fd2 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/event/event.py @@ -0,0 +1,123 @@ +import inspect +import time + +from zhenxun.services.log import logger + + +class Signal: + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + if instance is None: + return self + bound = instance.__dict__.get(self.name) + if bound is None: + bound = _SignalBound() + instance.__dict__[self.name] = bound + return bound + + +class _SignalBound: + def __init__(self): + self._slots = [] + self._onceSlots = [] + + def connect(self, func=None, *, priority=0): + if func is None: + return lambda f: self.connect(f, priority=priority) + if callable(func) and not any(s[0] == func for s in self._slots): + self._slots.append((func, priority)) + self._slots.sort(key=lambda x: -x[1]) + return func + + def connect_once(self, func=None, *, priority=0): + if func is None: + return lambda f: self.connect_once(f, priority=priority) + if callable(func) and not any(s[0] == func for s in self._onceSlots): + self._onceSlots.append((func, priority)) + self._onceSlots.sort(key=lambda x: -x[1]) + return func + + def disconnect(self, func): + self._slots = [s for s in self._slots if s[0] != func] + self._onceSlots = [s for s in self._onceSlots if s[0] != func] + + async def emit(self, *args, **kwargs): + slots = list(self._slots) + onceSlots = list(self._onceSlots) + self._onceSlots.clear() + for slot, _ in slots + onceSlots: + start = time.time() + try: + if inspect.iscoroutinefunction(slot): + await slot(*args, **kwargs) + else: + slot(*args, **kwargs) + logger.debug( + f"【真寻农场】事件槽 {slot.__name__} 执行完成,耗时 {(time.time() - start) * 1000:.2f} ms" + ) + except Exception as e: + logger.warning(f"事件槽 {slot.__name__} 触发异常: {e}") + + +class FarmEventManager: + m_beforePlant = Signal() + """播种前信号 + + Args: + uid (str): 用户Uid + name (str): 播种种子名称 + num (int): 播种数量 + """ + + m_afterPlant = Signal() + """播种后信号 每块地播种都会触发该信号 + + Args: + uid (str): 用户Uid + name (str): 播种种子名称 + soilIndex (int): 播种地块索引 从1开始 + """ + + m_beforeHarvest = Signal() + """收获前信号 + + Args: + uid (str): 用户Uid + """ + + m_afterHarvest = Signal() + """收获后信号 每块地收获都会触发该信号 + + Args: + uid (str): 用户Uid + name (str): 收获作物名称 + num (int): 收获数量 + soilIndex (int): 收获地块索引 从1开始 + """ + + m_beforeEradicate = Signal() + """铲除前信号 + + Args: + uid (str): 用户Uid + """ + + m_afterEradicate = Signal() + """铲除后信号 每块地铲除都会触发该信号 + + Args: + uid (str): 用户Uid + soilIndex (index): 铲除地块索引 从1开始 + """ + + m_beforeExpand = Signal() + m_afterExpand = Signal() + m_beforeSteal = Signal() + m_afterSteal = Signal() + + m_dit = Signal() + + +g_pEventManager = FarmEventManager() diff --git a/legacy/zhenxun_plugin_farm/log/log.md b/legacy/zhenxun_plugin_farm/log/log.md new file mode 100644 index 0000000..3a1b434 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/log/log.md @@ -0,0 +1,71 @@ +# 真寻农场更新日志 + +## V1.5 +用户方面 +--- +- 新增土地升级指令,快来将土地升级至红土地、黑土地、金土地吧 +- 新增查漏补缺作物资源功能,自动更新最新作物和作物资源文件 +- 定时更新签到文件、作物资源从00:30调整至04:30 +- 修正了部分土地资源错误的情况 +- 修正了部分文本信息错误的情况 + +代码方面 +--- +- 修正部分事件连接机制 +- 修正网络请求端口 + +## V1.4 +用户方面 +--- +- 新增种子商店筛选功能(如果没有BUG的话后续我的种子、我的作物等也会加入筛选功能 +- 新增签到功能(测试 +- 新增农场详述功能,能通过该功能更加详细的观看农场数据 +- 修复了迁移旧数据库无法正常迁移的BUG +- 修复了偷菜会导致偷自己的BUG +- 修正了作物阶段绘制不正确的BUG + +代码方面 +--- +- 修正了多阶段作物成长素材计算逻辑 +- 修正了作物数据库字段错乱的问题 +- 作物新增offset字段,用于以后偏移坐标和大小(尚未启用,该模式有商议 + +## V1.3 +用户方面 +--- +- 新增部分作物 +- 修复一个严重BUG, 该BUG会导致无法重复偷别人菜的问题 + +代码方面 +--- +- 将作物数据从plant.json迁移至resource/db/plant.db中,并将操作json改为操作数据库 + +## V1.2 +用户方面 +--- +- 修复重大BUG,该BUG会导致用户经验等级计算异常 +- 修正种子价格,现在不会以单价的形式购买种子了,而是新增的种子价格 + +代码方面 +--- +- 彻底重构数据库,但是不会像V1.1一样导致用户数据丢失 +- 迁移部分代码结构,使文件名和代码功能更加匹配 +- 加入事件机制,采用类似Qt信号槽机制 + +## V1.1 +用户方面 +--- +- 完善我的农场图片资源,现在会在左上角显示经验、等级、金币等详细信息了 +- 完善出售作物逻辑,现在可以空置作物名称来一键出售全部作物了,也可以选择空置数量来一键出售仓库种指定作物 +- 完善播种逻辑,现在可以空置数量来一键播种指定作物了 +- 新增更改农场名指令 +- 改进对土地开垦条件判断 + +代码方面 +--- +- 感谢[quanquan1014](https://github.com/quanquan1014)对农场名称中包含特殊字符的处理。 +- 更正数据库写法,但是会导致V1.0用户的作物和种子丢失 + +## V1.0 + +世界的起源。 diff --git a/legacy/zhenxun_plugin_farm/requirements.txt b/legacy/zhenxun_plugin_farm/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/legacy/zhenxun_plugin_farm/resource/1.png b/legacy/zhenxun_plugin_farm/resource/1.png new file mode 100644 index 0000000..53c5b09 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/background.jpg b/legacy/zhenxun_plugin_farm/resource/background/background.jpg new file mode 100644 index 0000000..3f8f9fa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/background.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon15.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon15.png new file mode 100644 index 0000000..8fce22b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon15.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon16.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon16.png new file mode 100644 index 0000000..72f37dd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon16.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon17.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon17.png new file mode 100644 index 0000000..32901ce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon17.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon18.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon18.png new file mode 100644 index 0000000..5b003dd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon18.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon19.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon19.png new file mode 100644 index 0000000..3ea5c21 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon19.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon20.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon20.png new file mode 100644 index 0000000..72e2c2d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon20.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon22.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon22.png new file mode 100644 index 0000000..2b27408 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon22.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon23.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon23.png new file mode 100644 index 0000000..8996b9f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon23.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon24.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon24.png new file mode 100644 index 0000000..93b93a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon24.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon39.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon39.jpg new file mode 100644 index 0000000..bebcbcc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon39.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon40.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon40.png new file mode 100644 index 0000000..5dba09d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon40.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon41.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon41.png new file mode 100644 index 0000000..d0d6d7a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon41.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon42.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon42.png new file mode 100644 index 0000000..8ce1334 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon42.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon43.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon43.png new file mode 100644 index 0000000..c5a2e9e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon43.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon44.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon44.png new file mode 100644 index 0000000..2177de6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon44.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon45.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon45.png new file mode 100644 index 0000000..c6b464a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon45.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon48.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon48.png new file mode 100644 index 0000000..160df32 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/DecorateIcon48.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_1.jpg new file mode 100644 index 0000000..bb0b278 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_2.png new file mode 100644 index 0000000..71ed359 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_3.png new file mode 100644 index 0000000..5d416b9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_4.png new file mode 100644 index 0000000..ffb49b5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_5.png new file mode 100644 index 0000000..f747220 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_6.png new file mode 100644 index 0000000..377d0e7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_7.png new file mode 100644 index 0000000..9b8cc94 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_autumn_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_1.jpg new file mode 100644 index 0000000..c8f359d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_2.png new file mode 100644 index 0000000..3ccbace Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_3.png new file mode 100644 index 0000000..b741838 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_4.png new file mode 100644 index 0000000..67e42c8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_5.png new file mode 100644 index 0000000..08d45d8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_6.png new file mode 100644 index 0000000..76254cf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_7.png new file mode 100644 index 0000000..ab29a85 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_8.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_8.png new file mode 100644 index 0000000..328ca23 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_8.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_9.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_9.png new file mode 100644 index 0000000..a330bb9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_bee_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_1.jpg new file mode 100644 index 0000000..b2c5683 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_10.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_10.png new file mode 100644 index 0000000..148ee66 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_10.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_2.png new file mode 100644 index 0000000..0ce80db Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_3.png new file mode 100644 index 0000000..ba6fd03 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_4.png new file mode 100644 index 0000000..4dd467f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_5.png new file mode 100644 index 0000000..421ad13 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_6.png new file mode 100644 index 0000000..c1d8484 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_7.png new file mode 100644 index 0000000..b667060 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_8.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_8.png new file mode 100644 index 0000000..3a73ec7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_8.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_9.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_9.png new file mode 100644 index 0000000..a0a745f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_default_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_1.jpg new file mode 100644 index 0000000..2915662 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_2.png new file mode 100644 index 0000000..a83cfe0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_3.png new file mode 100644 index 0000000..480cc4a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_4.png new file mode 100644 index 0000000..17198fe Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_5.png new file mode 100644 index 0000000..2b8e035 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_6.png new file mode 100644 index 0000000..6e41c70 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_7.png new file mode 100644 index 0000000..a0202e7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_9.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_9.png new file mode 100644 index 0000000..68bcb6f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_spring_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_1.jpg new file mode 100644 index 0000000..d4b12ac Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_2.png new file mode 100644 index 0000000..05805e3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_3.png new file mode 100644 index 0000000..f8c170d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_4.png new file mode 100644 index 0000000..fa98f94 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_5.png new file mode 100644 index 0000000..ad3569a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_6.png new file mode 100644 index 0000000..4a3f52c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_7.png new file mode 100644 index 0000000..579d66a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_9.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_9.png new file mode 100644 index 0000000..8860868 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_summer_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_1.jpg b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_1.jpg new file mode 100644 index 0000000..6383b22 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_1.jpg differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_2.png new file mode 100644 index 0000000..f43ddca Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_3.png new file mode 100644 index 0000000..8588704 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_4.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_4.png new file mode 100644 index 0000000..e269a85 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_5.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_5.png new file mode 100644 index 0000000..813e0c8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_6.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_6.png new file mode 100644 index 0000000..a4caae1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_7.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_7.png new file mode 100644 index 0000000..620ce93 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_8.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_8.png new file mode 100644 index 0000000..439ff79 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_8.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_9.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_9.png new file mode 100644 index 0000000..af0828f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/decorate_winter_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_1.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_1.png new file mode 100644 index 0000000..294f15e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_2.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_2.png new file mode 100644 index 0000000..f7d9923 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_3.png b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_3.png new file mode 100644 index 0000000..498e14a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/decorateIcon/dog_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/exp.png b/legacy/zhenxun_plugin_farm/resource/background/exp.png new file mode 100644 index 0000000..d9e88b9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/exp.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/expansion.png b/legacy/zhenxun_plugin_farm/resource/background/expansion.png new file mode 100644 index 0000000..f056606 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/expansion.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame.png new file mode 100644 index 0000000..a37e8bb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_10.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_10.png new file mode 100644 index 0000000..6d716e4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_10.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_11.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_11.png new file mode 100644 index 0000000..ea30a51 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_11.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_12.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_12.png new file mode 100644 index 0000000..135cc05 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_12.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_13.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_13.png new file mode 100644 index 0000000..918de71 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_13.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_2.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_2.png new file mode 100644 index 0000000..5c41251 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_27.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_27.png new file mode 100644 index 0000000..689ea00 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_27.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_29.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_29.png new file mode 100644 index 0000000..0f0dcdc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_29.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_3.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_3.png new file mode 100644 index 0000000..53f3484 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_4.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_4.png new file mode 100644 index 0000000..e0de92a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_43.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_43.png new file mode 100644 index 0000000..001870e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_43.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_44.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_44.png new file mode 100644 index 0000000..7fddaee Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_44.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_45.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_45.png new file mode 100644 index 0000000..3b18522 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_45.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_5.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_5.png new file mode 100644 index 0000000..497eed5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_6.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_6.png new file mode 100644 index 0000000..2d2571a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_6.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_7.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_7.png new file mode 100644 index 0000000..d3d7659 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_7.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_8.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_8.png new file mode 100644 index 0000000..dd6401f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_8.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/frame/frame_9.png b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_9.png new file mode 100644 index 0000000..8d1cc9f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/frame/frame_9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/point.png b/legacy/zhenxun_plugin_farm/resource/background/point.png new file mode 100644 index 0000000..537cc7f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/point.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/ripe.png b/legacy/zhenxun_plugin_farm/resource/background/ripe.png new file mode 100644 index 0000000..4f5b5db Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/ripe.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/userInfo.png b/legacy/zhenxun_plugin_farm/resource/background/userInfo.png new file mode 100644 index 0000000..1616766 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/userInfo.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/background/vipPoint.png b/legacy/zhenxun_plugin_farm/resource/background/vipPoint.png new file mode 100644 index 0000000..60464cc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/background/vipPoint.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/db/plant-test.db b/legacy/zhenxun_plugin_farm/resource/db/plant-test.db new file mode 100644 index 0000000..1e3d4d1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/db/plant-test.db differ diff --git a/legacy/zhenxun_plugin_farm/resource/db/plant.db b/legacy/zhenxun_plugin_farm/resource/db/plant.db new file mode 100644 index 0000000..da5cce4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/db/plant.db differ diff --git a/legacy/zhenxun_plugin_farm/resource/db/version.json b/legacy/zhenxun_plugin_farm/resource/db/version.json new file mode 100644 index 0000000..5e8fde9 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/resource/db/version.json @@ -0,0 +1 @@ +{"version": 0.41} \ No newline at end of file diff --git a/legacy/zhenxun_plugin_farm/resource/html/help.html b/legacy/zhenxun_plugin_farm/resource/html/help.html new file mode 100644 index 0000000..9bba29c --- /dev/null +++ b/legacy/zhenxun_plugin_farm/resource/html/help.html @@ -0,0 +1,777 @@ + + + + + + 智能功能展示 - 参数可视化 + + + +
+
+

✨ 真寻农场帮助菜单 ✨

+

简单介绍一下农场的各个功能和食用方法

+ +
+
+
+ 必填参数 +
+
+
+ 可选参数 +
+
+
+ 条件参数 +
+
+
+ +
+
+ +
+
+
+ +
+
at 开通农场
+
+ +
+
条件逻辑
+
+ • 需要at小真寻
+
+
+
+ +
+
+
+ +
+
我的农场
+
+
+ +
+
+
+ +
+
农场详述
+
+
+ +
+
+
+ +
+
我的农场币
+
+
+ + +
+
+
+ +
+
种子商店
+
+ +
+
参数列表
+
+
+ 条件 + 参数 - 根据类型决定含义 +
+
+
+ +
+
条件逻辑
+
+ • 如果参数是中文 → 进入筛选模式,可接页码参数
+ • 如果参数是数字 → 直接作为页码使用
+
+
+ +
+ 使用示例1: 种子商店 胡萝
+ 使用示例2: 种子商店 2
+ 使用示例3: 种子商店 胡萝 3 +
+
+ + +
+
+
+ +
+
购买种子
+
+ +
+
参数列表
+
+
+ 必填 + 作物/种子名称 +
+
+ 可选 + 数量 +
+
+
+ +
+ 使用示例: 购买种子 胡萝卜 + 使用示例: 购买种子 胡萝卜 5 +
+
+ +
+
+
+ +
+
我的种子
+
+
+ +
+
+
+ +
+
播种
+
+ +
+
参数列表
+
+
+ 必填 + 作物/种子名称 +
+
+ 可选 + 数量 +
+
+
+ +
+
操作提示
+
+ • 数量不填默认将最大可能播种 +
+
+ +
+ 使用示例1: 种子商店 胡萝
+ 使用示例2: 种子商店 2
+ 使用示例3: 种子商店 胡萝 3 +
+
+ +
+
+
+ +
+
收获
+
+
+ +
+
+
+ +
+
铲除
+
+
+ +
+
+
+ +
+
我的作物
+
+
+ +
+
+
+ +
+
出售作物
+
+ +
+
参数列表
+
+
+ 可选 + 作物/种子名称 +
+
+ 可选 + 数量 +
+
+
+ +
+
操作提示
+
+ • 不填写作物名将售卖仓库种全部作物
+ • 填作物名不填数量将指定作物全部出售 +
+
+
+ +
+
+
+ +
+
偷菜 at
+
+ +
+
条件逻辑
+
+ • 每人每天只能偷5次 + • 后续需要at目标且目标开通真寻农场 +
+
+
+ +
+
+
+ +
+
开垦
+
+
+ +
+
+
+ +
+
购买农场币
+
+ +
+
参数列表
+
+
+ 必填 + 数量 +
+
+
+ +
+
操作提示
+
+ • 数量为消耗金币的数量 +
+
+
+ +
+
+
+ +
+
更改农场名
+
+ +
+
参数列表
+
+
+ 必填 + 新的农场名 +
+
+
+ +
+
操作提示
+
+ • 仅支持部分特殊符号 +
+
+
+ +
+
+
+ +
+
农场签到
+
+
+ +
+
+
+ +
+
土地升级
+
+ +
+
参数列表
+
+
+ 必填 + 地块ID +
+
+
+ +
+
操作提示
+
+ • 地块ID通过农场详述获取 +
+
+
+ +
+
+
+ +
+
作物加锁
+
+ +
+
参数列表
+
+
+ 必填 + 地块ID +
+
+
+ +
+
操作提示
+
+ • 地块ID通过农场详述获取 +
+
+
+ +
+
+
+ +
+
作物解锁
+
+ +
+
参数列表
+
+
+ 必填 + 地块ID +
+
+
+ +
+
操作提示
+
+ • 地块ID通过农场详述获取 +
+
+
+ +
+
+
+ +
+
我的点券
+
+ +
+
参数列表
+
+
+ 必填 + 地块ID +
+
+
+ +
+
操作提示
+
+ • 地块ID通过农场详述获取 +
+
+
+ +
+
+
+ +
+
点券兑换
+
+ +
+
参数列表
+
+
+ 必填 + 地块ID +
+
+
+ +
+
操作提示
+
+ • 地块ID通过农场详述获取 +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/legacy/zhenxun_plugin_farm/resource/html/sign_in.html b/legacy/zhenxun_plugin_farm/resource/html/sign_in.html new file mode 100644 index 0000000..8036b76 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/resource/html/sign_in.html @@ -0,0 +1,230 @@ + + + + + + 每日签到 + + + +
+
+

🎯 每日签到奖励

+
{{ currentDate }}
+
+ +
+

🎁 今日签到奖励

+ {% for reward in todayRewards %} +
+ {{ reward.name }} +
{{ reward.name }} × {{ reward.quantity }}
+
+ {% endfor %} +
+ +
+

📊 累计签到进度

+ +
+ 当前进度 + {{ currentProgress }} / {{ totalMilestones }} +
+ +
+
+
+ +
+ 已达成 {{ achievedMilestones }} 个里程碑 +
+ + + {% for reward in cumulativeRewards %} +
+ {{ reward.name }} +
+ {{ reward.name }} × {{ reward.quantity }} +
+ {{ reward.description }} +
+
+
+ {% endfor %} +
+ + +
+ + \ No newline at end of file diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/1.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/1.png new file mode 100644 index 0000000..470bbe2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/2.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/2.png new file mode 100644 index 0000000..1c729bc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/3.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/3.png new file mode 100644 index 0000000..fa2521a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/4.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/4.png new file mode 100644 index 0000000..b399ef0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/5.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/5.png new file mode 100644 index 0000000..3ddc306 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/icon.png new file mode 100644 index 0000000..7d09384 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/ATTomato/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/basic/0.png b/legacy/zhenxun_plugin_farm/resource/plant/basic/0.png new file mode 100644 index 0000000..aee0a5c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/basic/0.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/basic/9.png b/legacy/zhenxun_plugin_farm/resource/plant/basic/9.png new file mode 100644 index 0000000..312fc6d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/basic/9.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/1.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/1.png new file mode 100644 index 0000000..8d72eb9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/2.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/2.png new file mode 100644 index 0000000..dc12c51 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/3.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/3.png new file mode 100644 index 0000000..d5a10c5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/4.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/4.png new file mode 100644 index 0000000..318a988 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/5.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/5.png new file mode 100644 index 0000000..22904b4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/一点红/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/一点红/icon.png new file mode 100644 index 0000000..74ebe5e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/一点红/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/1.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/1.png new file mode 100644 index 0000000..ba2096b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/2.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/2.png new file mode 100644 index 0000000..2f58eea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/3.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/3.png new file mode 100644 index 0000000..a7f9bea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/4.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/4.png new file mode 100644 index 0000000..c2dd16c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/5.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/5.png new file mode 100644 index 0000000..10c536c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/三七/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/三七/icon.png new file mode 100644 index 0000000..95c87b2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/三七/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/1.png new file mode 100644 index 0000000..2bb3b17 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/2.png new file mode 100644 index 0000000..0584835 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/3.png new file mode 100644 index 0000000..82f48fe Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/4.png new file mode 100644 index 0000000..a6cf753 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/5.png new file mode 100644 index 0000000..db204bb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/icon.png new file mode 100644 index 0000000..47c3297 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/丝瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/1.png new file mode 100644 index 0000000..d6b78f6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/2.png new file mode 100644 index 0000000..f488ed3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/3.png new file mode 100644 index 0000000..a7e015b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/4.png new file mode 100644 index 0000000..db6d0b2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/5.png new file mode 100644 index 0000000..a1fbde6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/icon.png new file mode 100644 index 0000000..ea8a2e6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/乌饭子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/1.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/1.png new file mode 100644 index 0000000..aec4715 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/2.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/2.png new file mode 100644 index 0000000..dc1317f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/3.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/3.png new file mode 100644 index 0000000..d0385ac Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/4.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/4.png new file mode 100644 index 0000000..9378c51 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/5.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/5.png new file mode 100644 index 0000000..e4864b2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/icon.png new file mode 100644 index 0000000..b6998f9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/兔儿伞/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/1.png new file mode 100644 index 0000000..8e41d4b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/2.png new file mode 100644 index 0000000..d5800db Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/3.png new file mode 100644 index 0000000..367b760 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/4.png new file mode 100644 index 0000000..c53dc3f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/5.png new file mode 100644 index 0000000..965e710 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关白附子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/icon.png new file mode 100644 index 0000000..428cd19 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关白附子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/1.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/1.png new file mode 100644 index 0000000..45c3eb1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/2.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/2.png new file mode 100644 index 0000000..f244047 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/3.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/3.png new file mode 100644 index 0000000..e14c78d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/4.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/4.png new file mode 100644 index 0000000..0ffc792 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/5.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/5.png new file mode 100644 index 0000000..1250c74 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/关苍术/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/icon.png new file mode 100644 index 0000000..d042edc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/关苍术/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/1.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/1.png new file mode 100644 index 0000000..5688adc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/2.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/2.png new file mode 100644 index 0000000..3c9f4a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/3.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/3.png new file mode 100644 index 0000000..d064e30 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/4.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/4.png new file mode 100644 index 0000000..a3a5681 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/5.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/5.png new file mode 100644 index 0000000..cb80a5a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/icon.png new file mode 100644 index 0000000..caeb467 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬凌草/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/1.png new file mode 100644 index 0000000..8e1ec4a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/2.png new file mode 100644 index 0000000..5fff0b5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/3.png new file mode 100644 index 0000000..7868747 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/4.png new file mode 100644 index 0000000..6722ddd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/5.png new file mode 100644 index 0000000..43b0b36 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/icon.png new file mode 100644 index 0000000..6a2c2e9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/冬瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/1.png new file mode 100644 index 0000000..e793278 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/2.png new file mode 100644 index 0000000..d8ea9de Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/3.png new file mode 100644 index 0000000..0438e4b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/4.png new file mode 100644 index 0000000..6c70643 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/5.png new file mode 100644 index 0000000..33ddbb7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/决明子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/决明子/icon.png new file mode 100644 index 0000000..6322715 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/决明子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/1.png new file mode 100644 index 0000000..ef8d7a0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/2.png new file mode 100644 index 0000000..452b604 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/3.png new file mode 100644 index 0000000..0424ecd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/4.png new file mode 100644 index 0000000..9393f6d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/5.png new file mode 100644 index 0000000..ae3e356 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/南瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/icon.png new file mode 100644 index 0000000..25c3a94 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/南瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/1.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/1.png new file mode 100644 index 0000000..0aa9045 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/2.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/2.png new file mode 100644 index 0000000..214922f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/3.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/3.png new file mode 100644 index 0000000..c8d7729 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/4.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/4.png new file mode 100644 index 0000000..dcc2b8d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/5.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/5.png new file mode 100644 index 0000000..3410590 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/icon.png new file mode 100644 index 0000000..a2823ae Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/双玉兰/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/1.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/1.png new file mode 100644 index 0000000..1627f13 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/2.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/2.png new file mode 100644 index 0000000..3d99ce5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/3.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/3.png new file mode 100644 index 0000000..f56adca Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/4.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/4.png new file mode 100644 index 0000000..87910b4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/5.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/5.png new file mode 100644 index 0000000..ad2edb7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/可可豆/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/icon.png new file mode 100644 index 0000000..7f16cad Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/可可豆/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/1.png new file mode 100644 index 0000000..f860837 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/2.png new file mode 100644 index 0000000..6fb68fb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/3.png new file mode 100644 index 0000000..abc0ec7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/4.png new file mode 100644 index 0000000..c81e0ea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/5.png new file mode 100644 index 0000000..de84adf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/icon.png new file mode 100644 index 0000000..1c6a3f9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/哈密瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/1.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/1.png new file mode 100644 index 0000000..9b88efa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/2.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/2.png new file mode 100644 index 0000000..9770149 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/3.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/3.png new file mode 100644 index 0000000..af474c3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/4.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/4.png new file mode 100644 index 0000000..cc1943e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/5.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/5.png new file mode 100644 index 0000000..b6fa942 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/园艺世/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/icon.png new file mode 100644 index 0000000..e7990d8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/园艺世/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/1.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/1.png new file mode 100644 index 0000000..9a24c8c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/2.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/2.png new file mode 100644 index 0000000..587867c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/3.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/3.png new file mode 100644 index 0000000..867b55c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/4.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/4.png new file mode 100644 index 0000000..e3e4ed7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/5.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/5.png new file mode 100644 index 0000000..a51a9f7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/土豆/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/土豆/icon.png new file mode 100644 index 0000000..40bfbae Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/土豆/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/1.png new file mode 100644 index 0000000..651ae57 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/2.png new file mode 100644 index 0000000..cf4936e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/3.png new file mode 100644 index 0000000..a649d85 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/4.png new file mode 100644 index 0000000..64a011f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/5.png new file mode 100644 index 0000000..9245a8a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大白菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/icon.png new file mode 100644 index 0000000..ff1fa65 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大白菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/1.png new file mode 100644 index 0000000..806cf3a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/2.png new file mode 100644 index 0000000..fe4b800 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/3.png new file mode 100644 index 0000000..ad56798 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/4.png new file mode 100644 index 0000000..be0607c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/5.png new file mode 100644 index 0000000..9188b12 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/大蒜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/icon.png new file mode 100644 index 0000000..8bf3c4d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/大蒜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/1.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/1.png new file mode 100644 index 0000000..8b0d3eb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/2.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/2.png new file mode 100644 index 0000000..e1452ae Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/3.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/3.png new file mode 100644 index 0000000..ea9fbf3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/4.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/4.png new file mode 100644 index 0000000..c9aad89 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/5.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/5.png new file mode 100644 index 0000000..81e8c73 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/icon.png new file mode 100644 index 0000000..8a9721c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/富贵竹/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小白菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/1.png new file mode 100644 index 0000000..0013afc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小白菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/2.png new file mode 100644 index 0000000..c638121 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小白菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/3.png new file mode 100644 index 0000000..5dd98cb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小白菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/4.png new file mode 100644 index 0000000..3d68789 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小白菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/icon.png new file mode 100644 index 0000000..d9bdab1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小白菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/1.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/1.png new file mode 100644 index 0000000..1ca3cd6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/2.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/2.png new file mode 100644 index 0000000..d941c69 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/3.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/3.png new file mode 100644 index 0000000..bb81287 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/4.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/4.png new file mode 100644 index 0000000..82973e5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/5.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/5.png new file mode 100644 index 0000000..47b16c9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/小麦/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/小麦/icon.png new file mode 100644 index 0000000..ab60a3d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/小麦/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/1.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/1.png new file mode 100644 index 0000000..99ca5e4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/2.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/2.png new file mode 100644 index 0000000..0f4e219 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/3.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/3.png new file mode 100644 index 0000000..a742f91 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/4.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/4.png new file mode 100644 index 0000000..14f17f3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/5.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/5.png new file mode 100644 index 0000000..dde13bc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/山竹/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/山竹/icon.png new file mode 100644 index 0000000..53f2f1e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/山竹/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/1.png new file mode 100644 index 0000000..aa09740 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/2.png new file mode 100644 index 0000000..9037833 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/3.png new file mode 100644 index 0000000..9daf6f8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/4.png new file mode 100644 index 0000000..c202d39 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/5.png new file mode 100644 index 0000000..0416c74 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/无花果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/无花果/icon.png new file mode 100644 index 0000000..eb7e6fc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/无花果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/1.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/1.png new file mode 100644 index 0000000..3d0b0a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/2.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/2.png new file mode 100644 index 0000000..bb59ca7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/3.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/3.png new file mode 100644 index 0000000..fc1ab98 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/4.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/4.png new file mode 100644 index 0000000..867ac5a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/5.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/5.png new file mode 100644 index 0000000..7f1a0cf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/月柿/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/月柿/icon.png new file mode 100644 index 0000000..d994504 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/月柿/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/1.png new file mode 100644 index 0000000..aa6f8d1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/2.png new file mode 100644 index 0000000..59dbeda Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/3.png new file mode 100644 index 0000000..c8b3839 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/4.png new file mode 100644 index 0000000..360aaaf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/5.png new file mode 100644 index 0000000..a5b9c05 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/木瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/icon.png new file mode 100644 index 0000000..62f245d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/木瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/1.png new file mode 100644 index 0000000..44a7f74 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/2.png new file mode 100644 index 0000000..aaa4ce5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/3.png new file mode 100644 index 0000000..ff86f1b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/4.png new file mode 100644 index 0000000..ab3a742 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/5.png new file mode 100644 index 0000000..b5c2753 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/李子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/李子/icon.png new file mode 100644 index 0000000..1ae3e67 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/李子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/1.png new file mode 100644 index 0000000..4e426dd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/2.png new file mode 100644 index 0000000..78fe0f3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/3.png new file mode 100644 index 0000000..4f69d17 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/4.png new file mode 100644 index 0000000..b87a5c0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/5.png new file mode 100644 index 0000000..0a63c34 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杏子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/杏子/icon.png new file mode 100644 index 0000000..2aa2ade Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杏子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/1.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/1.png new file mode 100644 index 0000000..048546c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/2.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/2.png new file mode 100644 index 0000000..5159dc9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/3.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/3.png new file mode 100644 index 0000000..14b4b68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/4.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/4.png new file mode 100644 index 0000000..834bf66 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/5.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/5.png new file mode 100644 index 0000000..d0a88da Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨桃/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/icon.png new file mode 100644 index 0000000..43bb6ee Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨桃/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/1.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/1.png new file mode 100644 index 0000000..16b90dc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/2.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/2.png new file mode 100644 index 0000000..8b4ea37 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/3.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/3.png new file mode 100644 index 0000000..ed57044 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/4.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/4.png new file mode 100644 index 0000000..821e02e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/5.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/5.png new file mode 100644 index 0000000..3f4ee0a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/杨梅/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/icon.png new file mode 100644 index 0000000..2c1f8cd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/杨梅/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/1.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/1.png new file mode 100644 index 0000000..1f73abb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/2.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/2.png new file mode 100644 index 0000000..23fa9d4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/3.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/3.png new file mode 100644 index 0000000..a106d8a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/4.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/4.png new file mode 100644 index 0000000..cf3ba3b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/5.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/5.png new file mode 100644 index 0000000..24dd7db Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/枇杷/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/icon.png new file mode 100644 index 0000000..d000c5c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/枇杷/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/1.png new file mode 100644 index 0000000..0de92fe Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/2.png new file mode 100644 index 0000000..013dd75 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/3.png new file mode 100644 index 0000000..4d33b12 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/4.png new file mode 100644 index 0000000..283d68b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/5.png new file mode 100644 index 0000000..ab5cb5f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柚子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/柚子/icon.png new file mode 100644 index 0000000..f74f0fd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柚子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/1.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/1.png new file mode 100644 index 0000000..deb3a63 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/2.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/2.png new file mode 100644 index 0000000..af0961b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/3.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/3.png new file mode 100644 index 0000000..a907fa5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/4.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/4.png new file mode 100644 index 0000000..a1042a9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/5.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/5.png new file mode 100644 index 0000000..19ce4d4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/柠檬/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/icon.png new file mode 100644 index 0000000..7852f8c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/柠檬/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/1.png new file mode 100644 index 0000000..efed9da Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/2.png new file mode 100644 index 0000000..98f5486 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/3.png new file mode 100644 index 0000000..c95e4d7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/4.png new file mode 100644 index 0000000..7d9c1d1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/5.png new file mode 100644 index 0000000..78b3e96 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/栗子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/栗子/icon.png new file mode 100644 index 0000000..67b2681 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/栗子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/1.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/1.png new file mode 100644 index 0000000..46e6239 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/2.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/2.png new file mode 100644 index 0000000..e677dc9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/3.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/3.png new file mode 100644 index 0000000..e6c0db4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/4.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/4.png new file mode 100644 index 0000000..bff8d97 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/5.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/5.png new file mode 100644 index 0000000..4235eb7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/核桃/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/核桃/icon.png new file mode 100644 index 0000000..d6fcea1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/核桃/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/1.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/1.png new file mode 100644 index 0000000..8c59958 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/2.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/2.png new file mode 100644 index 0000000..2c78345 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/3.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/3.png new file mode 100644 index 0000000..d983ee7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/4.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/4.png new file mode 100644 index 0000000..d3e1c9e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/5.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/5.png new file mode 100644 index 0000000..9916272 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桂圆/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/icon.png new file mode 100644 index 0000000..efe52fe Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桂圆/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/1.png new file mode 100644 index 0000000..2b38d63 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/2.png new file mode 100644 index 0000000..972908f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/3.png new file mode 100644 index 0000000..abf6eeb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/4.png new file mode 100644 index 0000000..c476f01 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/5.png new file mode 100644 index 0000000..0ac0938 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桃子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/桃子/icon.png new file mode 100644 index 0000000..598e779 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桃子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/1.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/1.png new file mode 100644 index 0000000..8f0f05b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/2.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/2.png new file mode 100644 index 0000000..c9b37cd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/3.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/3.png new file mode 100644 index 0000000..7f53e94 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/4.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/4.png new file mode 100644 index 0000000..b9cd892 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/5.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/5.png new file mode 100644 index 0000000..2ffae21 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/桑葚/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/icon.png new file mode 100644 index 0000000..acb61e9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/桑葚/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/1.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/1.png new file mode 100644 index 0000000..c31ec1d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/2.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/2.png new file mode 100644 index 0000000..f869118 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/3.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/3.png new file mode 100644 index 0000000..faa623d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/4.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/4.png new file mode 100644 index 0000000..59b2cee Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/5.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/5.png new file mode 100644 index 0000000..b6c5fe2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/梨/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/梨/icon.png new file mode 100644 index 0000000..b5de801 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/梨/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/1.png new file mode 100644 index 0000000..921dee5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/2.png new file mode 100644 index 0000000..5ec08d6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/3.png new file mode 100644 index 0000000..ca9fbd4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/4.png new file mode 100644 index 0000000..ffbded7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/5.png new file mode 100644 index 0000000..0c377ce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/椰子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/椰子/icon.png new file mode 100644 index 0000000..c54bbbb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/椰子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/1.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/1.png new file mode 100644 index 0000000..b8c8c5e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/2.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/2.png new file mode 100644 index 0000000..7b18d34 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/3.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/3.png new file mode 100644 index 0000000..0892c90 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/4.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/4.png new file mode 100644 index 0000000..f18b9ea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/5.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/5.png new file mode 100644 index 0000000..570be3b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榅桲/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/icon.png new file mode 100644 index 0000000..1f0b2aa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榅桲/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/1.png new file mode 100644 index 0000000..b576097 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/2.png new file mode 100644 index 0000000..1d4ca4f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/3.png new file mode 100644 index 0000000..fd89a04 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/4.png new file mode 100644 index 0000000..f3d965d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/5.png new file mode 100644 index 0000000..afe7c5b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榛子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/榛子/icon.png new file mode 100644 index 0000000..85ad3c4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榛子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/1.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/1.png new file mode 100644 index 0000000..a84c5ce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/2.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/2.png new file mode 100644 index 0000000..1c009ed Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/3.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/3.png new file mode 100644 index 0000000..de07aee Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/4.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/4.png new file mode 100644 index 0000000..06e9288 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/5.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/5.png new file mode 100644 index 0000000..1692fc3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/榴莲/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/icon.png new file mode 100644 index 0000000..5a2d678 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/榴莲/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/1.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/1.png new file mode 100644 index 0000000..4b08792 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/2.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/2.png new file mode 100644 index 0000000..044ac06 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/3.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/3.png new file mode 100644 index 0000000..19e68ea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/4.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/4.png new file mode 100644 index 0000000..5d3a996 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/5.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/5.png new file mode 100644 index 0000000..0d90695 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/樱桃/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/icon.png new file mode 100644 index 0000000..ba10028 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/樱桃/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/1.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/1.png new file mode 100644 index 0000000..9265af1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/2.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/2.png new file mode 100644 index 0000000..70f5b95 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/3.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/3.png new file mode 100644 index 0000000..04e2543 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/4.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/4.png new file mode 100644 index 0000000..b4192ce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/5.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/5.png new file mode 100644 index 0000000..f5cb6c9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橄榄/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/icon.png new file mode 100644 index 0000000..5d395f0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橄榄/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/1.png new file mode 100644 index 0000000..a444288 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/2.png new file mode 100644 index 0000000..f84d73f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/3.png new file mode 100644 index 0000000..3a1f926 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/4.png new file mode 100644 index 0000000..661ff6e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/5.png new file mode 100644 index 0000000..c37c566 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/橙子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/橙子/icon.png new file mode 100644 index 0000000..48bad24 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/橙子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/1.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/1.png new file mode 100644 index 0000000..3e4c81e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/2.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/2.png new file mode 100644 index 0000000..60f5139 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/3.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/3.png new file mode 100644 index 0000000..f7e4230 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/4.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/4.png new file mode 100644 index 0000000..d0185c0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/5.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/5.png new file mode 100644 index 0000000..9f7f0c2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/水稻/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/水稻/icon.png new file mode 100644 index 0000000..51636b7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/水稻/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/1.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/1.png new file mode 100644 index 0000000..46b7791 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/2.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/2.png new file mode 100644 index 0000000..0c91a60 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/3.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/3.png new file mode 100644 index 0000000..26b7587 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/4.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/4.png new file mode 100644 index 0000000..152709c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/5.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/5.png new file mode 100644 index 0000000..786b678 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/沙棘/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/icon.png new file mode 100644 index 0000000..67f8440 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/沙棘/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/油菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/油菜/1.png new file mode 100644 index 0000000..b938d22 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/油菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/油菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/油菜/2.png new file mode 100644 index 0000000..1d85cae Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/油菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/油菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/油菜/3.png new file mode 100644 index 0000000..9f3093b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/油菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/油菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/油菜/4.png new file mode 100644 index 0000000..d037f89 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/油菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/油菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/油菜/icon.png new file mode 100644 index 0000000..ae3797a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/油菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/1.png new file mode 100644 index 0000000..d39bcaa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/2.png new file mode 100644 index 0000000..6ffa391 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/3.png new file mode 100644 index 0000000..6bd5564 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/4.png new file mode 100644 index 0000000..a2ce322 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/5.png new file mode 100644 index 0000000..a9d97c7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/火龙果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/icon.png new file mode 100644 index 0000000..f8b88f8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/火龙果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/1.png new file mode 100644 index 0000000..df3028f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/2.png new file mode 100644 index 0000000..68f6a96 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/3.png new file mode 100644 index 0000000..d783bca Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/4.png new file mode 100644 index 0000000..10eeb88 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/5.png new file mode 100644 index 0000000..82ef9bf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/icon.png new file mode 100644 index 0000000..2db6d25 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/灯笼果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/1.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/1.png new file mode 100644 index 0000000..886c147 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/2.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/2.png new file mode 100644 index 0000000..8797388 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/3.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/3.png new file mode 100644 index 0000000..2a0ef99 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/4.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/4.png new file mode 100644 index 0000000..88d13d3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/5.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/5.png new file mode 100644 index 0000000..8f129a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/点地梅/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/icon.png new file mode 100644 index 0000000..fe30308 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/点地梅/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/牧草/1.png b/legacy/zhenxun_plugin_farm/resource/plant/牧草/1.png new file mode 100644 index 0000000..dc3f72d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/牧草/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/牧草/2.png b/legacy/zhenxun_plugin_farm/resource/plant/牧草/2.png new file mode 100644 index 0000000..2464296 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/牧草/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/牧草/3.png b/legacy/zhenxun_plugin_farm/resource/plant/牧草/3.png new file mode 100644 index 0000000..f0d6beb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/牧草/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/牧草/4.png b/legacy/zhenxun_plugin_farm/resource/plant/牧草/4.png new file mode 100644 index 0000000..36acd79 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/牧草/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/牧草/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/牧草/icon.png new file mode 100644 index 0000000..24d6b12 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/牧草/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/1.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/1.png new file mode 100644 index 0000000..e2b51d2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/2.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/2.png new file mode 100644 index 0000000..54ac61d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/3.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/3.png new file mode 100644 index 0000000..45ab33e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/4.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/4.png new file mode 100644 index 0000000..647bf19 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/5.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/5.png new file mode 100644 index 0000000..b59f0e8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/icon.png new file mode 100644 index 0000000..d4bf34d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/猕猴桃/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/1.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/1.png new file mode 100644 index 0000000..6b38c60 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/2.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/2.png new file mode 100644 index 0000000..1e171ff Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/3.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/3.png new file mode 100644 index 0000000..dbb0efd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/4.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/4.png new file mode 100644 index 0000000..9b79db1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/5.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/5.png new file mode 100644 index 0000000..3724e68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/玉米/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/玉米/icon.png new file mode 100644 index 0000000..921225d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/玉米/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/1.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/1.png new file mode 100644 index 0000000..12f9f5f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/2.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/2.png new file mode 100644 index 0000000..dac7fa0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/3.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/3.png new file mode 100644 index 0000000..fcc210f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/4.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/4.png new file mode 100644 index 0000000..32ee986 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/5.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/5.png new file mode 100644 index 0000000..e54c275 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/icon.png new file mode 100644 index 0000000..efb1b9f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/甘蔗/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/1.png new file mode 100644 index 0000000..a4d6abd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/2.png new file mode 100644 index 0000000..e397eaa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/3.png new file mode 100644 index 0000000..b9aeae4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/4.png new file mode 100644 index 0000000..0d9aadd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/5.png new file mode 100644 index 0000000..13d1ae6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/生菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/生菜/icon.png new file mode 100644 index 0000000..2f8eef3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/生菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/1.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/1.png new file mode 100644 index 0000000..ce2bf14 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/2.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/2.png new file mode 100644 index 0000000..f241333 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/3.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/3.png new file mode 100644 index 0000000..15ac948 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/4.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/4.png new file mode 100644 index 0000000..5b7258d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/5.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/5.png new file mode 100644 index 0000000..6a88901 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番石榴/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/icon.png new file mode 100644 index 0000000..9efbfc8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番石榴/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/1.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/1.png new file mode 100644 index 0000000..470bbe2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/2.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/2.png new file mode 100644 index 0000000..1c729bc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/3.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/3.png new file mode 100644 index 0000000..fa2521a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/4.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/4.png new file mode 100644 index 0000000..b399ef0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/5.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/5.png new file mode 100644 index 0000000..3ddc306 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番茄/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/番茄/icon.png new file mode 100644 index 0000000..7d09384 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番茄/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/1.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/1.png new file mode 100644 index 0000000..f136d05 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/2.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/2.png new file mode 100644 index 0000000..dffe8c4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/3.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/3.png new file mode 100644 index 0000000..feea5dc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/4.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/4.png new file mode 100644 index 0000000..f21897f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/5.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/5.png new file mode 100644 index 0000000..aed01c9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/icon.png new file mode 100644 index 0000000..fe8f3a9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/番荔枝/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/1.png new file mode 100644 index 0000000..ffa3e70 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/2.png new file mode 100644 index 0000000..59bcb27 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/3.png new file mode 100644 index 0000000..73e06f0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/4.png new file mode 100644 index 0000000..63f14a4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/icon.png new file mode 100644 index 0000000..2289998 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/白萝卜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/1.png new file mode 100644 index 0000000..248549e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/2.png new file mode 100644 index 0000000..ed17e30 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/3.png new file mode 100644 index 0000000..e13b128 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/4.png new file mode 100644 index 0000000..3864bbb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/5.png new file mode 100644 index 0000000..5d71fe3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/百香果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/百香果/icon.png new file mode 100644 index 0000000..9bca84a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/百香果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/1.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/1.png new file mode 100644 index 0000000..af91d37 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/2.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/2.png new file mode 100644 index 0000000..d4cbabc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/3.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/3.png new file mode 100644 index 0000000..95a5f07 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/4.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/4.png new file mode 100644 index 0000000..897765f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/5.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/5.png new file mode 100644 index 0000000..a293528 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/益母草/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/益母草/icon.png new file mode 100644 index 0000000..9202360 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/益母草/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/1.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/1.png new file mode 100644 index 0000000..adcd22c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/2.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/2.png new file mode 100644 index 0000000..004db27 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/3.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/3.png new file mode 100644 index 0000000..aaff73d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/4.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/4.png new file mode 100644 index 0000000..9af02b9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/5.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/5.png new file mode 100644 index 0000000..baf9603 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/睡莲/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/icon.png new file mode 100644 index 0000000..8175cf6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/睡莲/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/1.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/1.png new file mode 100644 index 0000000..6fa446f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/2.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/2.png new file mode 100644 index 0000000..28a2785 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/3.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/3.png new file mode 100644 index 0000000..ec44ff8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/4.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/4.png new file mode 100644 index 0000000..51513bf Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/5.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/5.png new file mode 100644 index 0000000..9fa5f0c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/石榴/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/石榴/icon.png new file mode 100644 index 0000000..a17a315 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/石榴/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/1.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/1.png new file mode 100644 index 0000000..2a8dfdc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/2.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/2.png new file mode 100644 index 0000000..10223a7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/3.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/3.png new file mode 100644 index 0000000..a0b1cd3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/4.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/4.png new file mode 100644 index 0000000..daf496e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/5.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/5.png new file mode 100644 index 0000000..3a23e87 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/竹笋/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/icon.png new file mode 100644 index 0000000..92150f5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/竹笋/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/1.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/1.png new file mode 100644 index 0000000..844e9df Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/2.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/2.png new file mode 100644 index 0000000..b912c71 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/3.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/3.png new file mode 100644 index 0000000..790a82c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/4.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/4.png new file mode 100644 index 0000000..06c45f2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/5.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/5.png new file mode 100644 index 0000000..bba504d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/箬竹/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/icon.png new file mode 100644 index 0000000..d7ca187 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/箬竹/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/1.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/1.png new file mode 100644 index 0000000..dbba79a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/2.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/2.png new file mode 100644 index 0000000..417f839 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/3.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/3.png new file mode 100644 index 0000000..ac9fb87 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/4.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/4.png new file mode 100644 index 0000000..7fe556f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/5.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/5.png new file mode 100644 index 0000000..0f259a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/icon.png new file mode 100644 index 0000000..af4a5dc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红叶梅/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/1.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/1.png new file mode 100644 index 0000000..3466188 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/2.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/2.png new file mode 100644 index 0000000..1d82370 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/3.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/3.png new file mode 100644 index 0000000..4f9463a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/4.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/4.png new file mode 100644 index 0000000..542fd22 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/5.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/5.png new file mode 100644 index 0000000..0487787 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红枣/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/红枣/icon.png new file mode 100644 index 0000000..a3c9035 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红枣/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/1.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/1.png new file mode 100644 index 0000000..74a4fde Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/2.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/2.png new file mode 100644 index 0000000..ddf3bd8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/3.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/3.png new file mode 100644 index 0000000..c3c0960 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/4.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/4.png new file mode 100644 index 0000000..79f9f0e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/5.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/5.png new file mode 100644 index 0000000..3737869 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/icon.png new file mode 100644 index 0000000..a40cb5f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红毛丹/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/1.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/1.png new file mode 100644 index 0000000..4a04a76 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/2.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/2.png new file mode 100644 index 0000000..40fae8a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/3.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/3.png new file mode 100644 index 0000000..ce8d4d5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/4.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/4.png new file mode 100644 index 0000000..ce55f8c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/5.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/5.png new file mode 100644 index 0000000..145bad7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/icon.png new file mode 100644 index 0000000..55073ef Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/红玫瑰/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/1.png new file mode 100644 index 0000000..810e456 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/2.png new file mode 100644 index 0000000..07680e0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/3.png new file mode 100644 index 0000000..ba91e1b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/4.png new file mode 100644 index 0000000..8507c1a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/icon.png new file mode 100644 index 0000000..2e51389 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/胡萝卜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/1.png new file mode 100644 index 0000000..3fe4348 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/2.png new file mode 100644 index 0000000..077e91b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/3.png new file mode 100644 index 0000000..56fd1da Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/4.png new file mode 100644 index 0000000..e3d69e9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/5.png new file mode 100644 index 0000000..74b927c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芒果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/芒果/icon.png new file mode 100644 index 0000000..4d3f84e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芒果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/0.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/0.png new file mode 100644 index 0000000..c1843bc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/0.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/1.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/1.png new file mode 100644 index 0000000..9321bc0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/2.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/2.png new file mode 100644 index 0000000..e371d05 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/3.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/3.png new file mode 100644 index 0000000..81d12b1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/4.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/4.png new file mode 100644 index 0000000..7dc80ba Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/5.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/5.png new file mode 100644 index 0000000..0b54c96 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芦荟/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/icon.png new file mode 100644 index 0000000..e2758c4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芦荟/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/1.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/1.png new file mode 100644 index 0000000..4c053b2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/2.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/2.png new file mode 100644 index 0000000..09234b0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/3.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/3.png new file mode 100644 index 0000000..10756c2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/4.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/4.png new file mode 100644 index 0000000..b252e67 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/5.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/5.png new file mode 100644 index 0000000..4894755 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/icon.png new file mode 100644 index 0000000..df5b825 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芭蕉/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/1.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/1.png new file mode 100644 index 0000000..7a92deb Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/2.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/2.png new file mode 100644 index 0000000..06af7fd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/3.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/3.png new file mode 100644 index 0000000..f4f8032 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/4.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/4.png new file mode 100644 index 0000000..9e37310 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/5.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/5.png new file mode 100644 index 0000000..90f4353 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花生/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/花生/icon.png new file mode 100644 index 0000000..df4f253 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花生/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/1.png new file mode 100644 index 0000000..f63101d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/2.png new file mode 100644 index 0000000..715edd4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/3.png new file mode 100644 index 0000000..2384e28 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/4.png new file mode 100644 index 0000000..0f459ca Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/5.png new file mode 100644 index 0000000..5de7ea4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/花菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/花菜/icon.png new file mode 100644 index 0000000..a7a4b92 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/花菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/1.png new file mode 100644 index 0000000..239784b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/2.png new file mode 100644 index 0000000..c2d9ea4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/3.png new file mode 100644 index 0000000..4cc23f1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/4.png new file mode 100644 index 0000000..90e1eb2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/5.png new file mode 100644 index 0000000..0d6f5d7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/芹菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/icon.png new file mode 100644 index 0000000..f4d2d3e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/芹菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/1.png new file mode 100644 index 0000000..a718f57 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/2.png new file mode 100644 index 0000000..fc04910 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/3.png new file mode 100644 index 0000000..34bd32f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/4.png new file mode 100644 index 0000000..21a7a18 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/5.png new file mode 100644 index 0000000..5c4f31a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/icon.png new file mode 100644 index 0000000..d315897 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苦瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/1.png new file mode 100644 index 0000000..73723c1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/2.png new file mode 100644 index 0000000..b15422d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/3.png new file mode 100644 index 0000000..caec43b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/4.png new file mode 100644 index 0000000..64bd78f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/5.png new file mode 100644 index 0000000..fafcaf9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/苹果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/苹果/icon.png new file mode 100644 index 0000000..cbfebd8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/苹果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/1.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/1.png new file mode 100644 index 0000000..756cc45 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/2.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/2.png new file mode 100644 index 0000000..0e79a5d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/3.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/3.png new file mode 100644 index 0000000..d86d25b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/4.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/4.png new file mode 100644 index 0000000..29389cc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/5.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/5.png new file mode 100644 index 0000000..ea060b1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/茄子/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/茄子/icon.png new file mode 100644 index 0000000..84b4597 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/茄子/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/1.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/1.png new file mode 100644 index 0000000..8e4679f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/2.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/2.png new file mode 100644 index 0000000..ae4c4f0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/3.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/3.png new file mode 100644 index 0000000..baab9ac Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/4.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/4.png new file mode 100644 index 0000000..5a795b7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/5.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/5.png new file mode 100644 index 0000000..7bfd509 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/草莓/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/草莓/icon.png new file mode 100644 index 0000000..8c1e2c2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/草莓/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/1.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/1.png new file mode 100644 index 0000000..35d2635 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/2.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/2.png new file mode 100644 index 0000000..9520284 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/3.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/3.png new file mode 100644 index 0000000..5d05fcd Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/4.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/4.png new file mode 100644 index 0000000..5b3adce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/5.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/5.png new file mode 100644 index 0000000..12d52a0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/荔枝/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/icon.png new file mode 100644 index 0000000..1c36ae7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/荔枝/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/1.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/1.png new file mode 100644 index 0000000..c318b07 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/2.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/2.png new file mode 100644 index 0000000..d9ca2b5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/3.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/3.png new file mode 100644 index 0000000..7ab1121 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/4.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/4.png new file mode 100644 index 0000000..51d3179 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/5.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/5.png new file mode 100644 index 0000000..f7280f8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲藕/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/icon.png new file mode 100644 index 0000000..9853d7b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲藕/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/1.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/1.png new file mode 100644 index 0000000..94d269d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/2.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/2.png new file mode 100644 index 0000000..fb8cc68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/3.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/3.png new file mode 100644 index 0000000..581d209 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/4.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/4.png new file mode 100644 index 0000000..791f9d7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/5.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/5.png new file mode 100644 index 0000000..a721a88 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/莲雾/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/icon.png new file mode 100644 index 0000000..dd6c163 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/莲雾/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/1.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/1.png new file mode 100644 index 0000000..6812fa1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/2.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/2.png new file mode 100644 index 0000000..2dcd2b4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/3.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/3.png new file mode 100644 index 0000000..28283e4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/4.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/4.png new file mode 100644 index 0000000..35aac72 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/5.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/5.png new file mode 100644 index 0000000..6aafc09 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/icon.png new file mode 100644 index 0000000..c1f6af2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/1.png new file mode 100644 index 0000000..abd7222 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/2.png new file mode 100644 index 0000000..c0db282 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/3.png new file mode 100644 index 0000000..a7796e9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/4.png new file mode 100644 index 0000000..82fb5e3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/5.png new file mode 100644 index 0000000..35c4a93 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/icon.png new file mode 100644 index 0000000..ee02d77 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/菠萝蜜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/1.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/1.png new file mode 100644 index 0000000..9d3468f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/2.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/2.png new file mode 100644 index 0000000..ede6d7b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/3.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/3.png new file mode 100644 index 0000000..b45c167 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/4.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/4.png new file mode 100644 index 0000000..d123831 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/5.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/5.png new file mode 100644 index 0000000..235a9b1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葡萄/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/icon.png new file mode 100644 index 0000000..f55ca8e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葡萄/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/1.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/1.png new file mode 100644 index 0000000..ef9ae8c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/2.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/2.png new file mode 100644 index 0000000..dbdfb0b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/3.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/3.png new file mode 100644 index 0000000..3827138 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/4.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/4.png new file mode 100644 index 0000000..711f403 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/5.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/5.png new file mode 100644 index 0000000..d23c252 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/葫芦/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/icon.png new file mode 100644 index 0000000..83e3559 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/葫芦/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/1.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/1.png new file mode 100644 index 0000000..a9f5878 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/2.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/2.png new file mode 100644 index 0000000..dce2c96 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/3.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/3.png new file mode 100644 index 0000000..b0492d4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/4.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/4.png new file mode 100644 index 0000000..8499c88 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/5.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/5.png new file mode 100644 index 0000000..a9e33d2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/icon.png new file mode 100644 index 0000000..b849329 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蓝莓/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/1.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/1.png new file mode 100644 index 0000000..e181ef5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/2.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/2.png new file mode 100644 index 0000000..3e966c0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/3.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/3.png new file mode 100644 index 0000000..1315a27 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/4.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/4.png new file mode 100644 index 0000000..b9aea49 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/5.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/5.png new file mode 100644 index 0000000..379116f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/薄荷/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/icon.png new file mode 100644 index 0000000..1ca096c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/薄荷/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/1.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/1.png new file mode 100644 index 0000000..e236a9b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/2.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/2.png new file mode 100644 index 0000000..658d5d8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/3.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/3.png new file mode 100644 index 0000000..9a369f4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/4.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/4.png new file mode 100644 index 0000000..5bc6fc1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/5.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/5.png new file mode 100644 index 0000000..d4eb329 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/icon.png new file mode 100644 index 0000000..2bb9b8f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蘑菇/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/1.png new file mode 100644 index 0000000..89aa0f3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/2.png new file mode 100644 index 0000000..49d746b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/3.png new file mode 100644 index 0000000..7c9bfe3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/4.png new file mode 100644 index 0000000..e383979 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/5.png new file mode 100644 index 0000000..f81ff0e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/icon.png new file mode 100644 index 0000000..3a23a5b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蛋黄果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/1.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/1.png new file mode 100644 index 0000000..55fb940 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/2.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/2.png new file mode 100644 index 0000000..00fdd1e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/3.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/3.png new file mode 100644 index 0000000..d06c7ec Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/4.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/4.png new file mode 100644 index 0000000..412f9c8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/5.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/5.png new file mode 100644 index 0000000..1c7ea90 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/icon.png new file mode 100644 index 0000000..fff083d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/蜜思桃/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/1.png new file mode 100644 index 0000000..aa3ede9 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/2.png new file mode 100644 index 0000000..0f04356 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/3.png new file mode 100644 index 0000000..5988384 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/4.png new file mode 100644 index 0000000..f69c54c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/5.png new file mode 100644 index 0000000..df47f0d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/西瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/icon.png new file mode 100644 index 0000000..63425ce Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/西瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/1.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/1.png new file mode 100644 index 0000000..9d1fa0a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/2.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/2.png new file mode 100644 index 0000000..0600ee0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/3.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/3.png new file mode 100644 index 0000000..d78380c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/4.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/4.png new file mode 100644 index 0000000..ebdaf6b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/5.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/5.png new file mode 100644 index 0000000..4e61f5b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/豌豆/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/icon.png new file mode 100644 index 0000000..7bf7e81 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/豌豆/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/1.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/1.png new file mode 100644 index 0000000..45796af Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/2.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/2.png new file mode 100644 index 0000000..95ab99b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/3.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/3.png new file mode 100644 index 0000000..1897d68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/4.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/4.png new file mode 100644 index 0000000..0b4d2d0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/5.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/5.png new file mode 100644 index 0000000..6eceed0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/辣椒/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/icon.png new file mode 100644 index 0000000..d22314a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/辣椒/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/1.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/1.png new file mode 100644 index 0000000..9c36d2e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/2.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/2.png new file mode 100644 index 0000000..9bce08e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/3.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/3.png new file mode 100644 index 0000000..a7bfc56 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/4.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/4.png new file mode 100644 index 0000000..72a2ed8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/5.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/5.png new file mode 100644 index 0000000..4bf920b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/迎春花/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/icon.png new file mode 100644 index 0000000..4273689 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/迎春花/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/1.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/1.png new file mode 100644 index 0000000..a3c3f49 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/2.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/2.png new file mode 100644 index 0000000..38273b4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/3.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/3.png new file mode 100644 index 0000000..3dd5b76 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/4.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/4.png new file mode 100644 index 0000000..f72ad68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/5.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/5.png new file mode 100644 index 0000000..9568b0e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金桔/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/金桔/icon.png new file mode 100644 index 0000000..a28125e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金桔/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/1.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/1.png new file mode 100644 index 0000000..b4e88d8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/2.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/2.png new file mode 100644 index 0000000..23e1f39 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/3.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/3.png new file mode 100644 index 0000000..774969c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/4.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/4.png new file mode 100644 index 0000000..afbc2e8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/5.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/5.png new file mode 100644 index 0000000..bc42f76 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/金针菇/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/icon.png new file mode 100644 index 0000000..2bc2f99 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/金针菇/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/1.png new file mode 100644 index 0000000..9469c84 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/2.png new file mode 100644 index 0000000..7377528 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/3.png new file mode 100644 index 0000000..ee2588e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/4.png new file mode 100644 index 0000000..a7c24b0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/5.png new file mode 100644 index 0000000..67b0c4f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/韭菜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/icon.png new file mode 100644 index 0000000..8f73979 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/韭菜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/1.png new file mode 100644 index 0000000..e0a9606 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/2.png new file mode 100644 index 0000000..f9dcb96 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/3.png new file mode 100644 index 0000000..5186877 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/4.png new file mode 100644 index 0000000..3862f34 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/5.png new file mode 100644 index 0000000..021152e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/icon.png new file mode 100644 index 0000000..a4a33f2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/1.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/1.png new file mode 100644 index 0000000..2feafb4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/2.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/2.png new file mode 100644 index 0000000..64b9a2a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/3.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/3.png new file mode 100644 index 0000000..e090a79 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/4.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/4.png new file mode 100644 index 0000000..8619dec Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/5.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/5.png new file mode 100644 index 0000000..f857a33 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/icon.png new file mode 100644 index 0000000..4328b05 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香粽龙舟/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/1.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/1.png new file mode 100644 index 0000000..70fd43c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/2.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/2.png new file mode 100644 index 0000000..834962c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/3.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/3.png new file mode 100644 index 0000000..ec4d60d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/4.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/4.png new file mode 100644 index 0000000..885486f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/5.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/5.png new file mode 100644 index 0000000..1bfc2d5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/香蕉/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/icon.png new file mode 100644 index 0000000..44640c0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/香蕉/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/1.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/1.png new file mode 100644 index 0000000..ccfa8bc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/2.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/2.png new file mode 100644 index 0000000..ae3d7fc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/3.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/3.png new file mode 100644 index 0000000..e111d31 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/4.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/4.png new file mode 100644 index 0000000..e61fa45 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/5.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/5.png new file mode 100644 index 0000000..e6d3956 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/icon.png new file mode 100644 index 0000000..06f49c0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/魔法神花/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/1.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/1.png new file mode 100644 index 0000000..32dc54e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/2.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/2.png new file mode 100644 index 0000000..3d629a1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/3.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/3.png new file mode 100644 index 0000000..e272b67 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/4.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/4.png new file mode 100644 index 0000000..d9cada3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/5.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/5.png new file mode 100644 index 0000000..3034132 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/icon.png new file mode 100644 index 0000000..8cd8099 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鳄梨/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/1.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/1.png new file mode 100644 index 0000000..7383d18 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/2.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/2.png new file mode 100644 index 0000000..084ff84 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/3.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/3.png new file mode 100644 index 0000000..472adba Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/4.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/4.png new file mode 100644 index 0000000..52be429 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/5.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/5.png new file mode 100644 index 0000000..fcecec6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/icon.png new file mode 100644 index 0000000..a7a9c63 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/鸾风玉/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/1.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/1.png new file mode 100644 index 0000000..3b66895 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/2.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/2.png new file mode 100644 index 0000000..379da3e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/3.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/3.png new file mode 100644 index 0000000..fa0fd52 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/4.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/4.png new file mode 100644 index 0000000..c0f07a3 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/5.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/5.png new file mode 100644 index 0000000..881d1fc Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/icon.png new file mode 100644 index 0000000..521f8aa Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄瓜/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/1.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/1.png new file mode 100644 index 0000000..5432e0b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/2.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/2.png new file mode 100644 index 0000000..b5166ea Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/3.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/3.png new file mode 100644 index 0000000..17a1181 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/4.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/4.png new file mode 100644 index 0000000..194b675 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/5.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/5.png new file mode 100644 index 0000000..487d95f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄豆/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/icon.png new file mode 100644 index 0000000..e3fb0a8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄豆/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/1.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/1.png new file mode 100644 index 0000000..e609a35 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/2.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/2.png new file mode 100644 index 0000000..d215917 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/3.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/3.png new file mode 100644 index 0000000..11992c2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/4.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/4.png new file mode 100644 index 0000000..e561be7 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/5.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/5.png new file mode 100644 index 0000000..b11718d Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黄金果/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/icon.png new file mode 100644 index 0000000..60d32a1 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黄金果/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/1.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/1.png new file mode 100644 index 0000000..ff151c8 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/1.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/2.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/2.png new file mode 100644 index 0000000..799bfe2 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/2.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/3.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/3.png new file mode 100644 index 0000000..72d2eca Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/3.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/4.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/4.png new file mode 100644 index 0000000..ef0f10a Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/4.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/5.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/5.png new file mode 100644 index 0000000..9a9a85f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/5.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/icon.png b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/icon.png new file mode 100644 index 0000000..f6c1417 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/plant/黑布仑/icon.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/普通土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/普通土地-施肥.png new file mode 100644 index 0000000..55a173c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/普通土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/普通土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/普通土地-缺水.png new file mode 100644 index 0000000..f794578 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/普通土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/普通土地.png b/legacy/zhenxun_plugin_farm/resource/soil/普通土地.png new file mode 100644 index 0000000..ac01d80 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/普通土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-施肥.png new file mode 100644 index 0000000..e8d2729 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-缺水.png new file mode 100644 index 0000000..69d6369 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/紫金土地.png b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地.png new file mode 100644 index 0000000..cbeae00 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/紫金土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/红土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/红土地-施肥.png new file mode 100644 index 0000000..072775b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/红土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/红土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/红土地-缺水.png new file mode 100644 index 0000000..5c215a5 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/红土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/红土地.png b/legacy/zhenxun_plugin_farm/resource/soil/红土地.png new file mode 100644 index 0000000..b3b88af Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/红土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/草土地.png b/legacy/zhenxun_plugin_farm/resource/soil/草土地.png new file mode 100644 index 0000000..e8e028b Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/草土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-施肥.png new file mode 100644 index 0000000..9babc68 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-缺水.png new file mode 100644 index 0000000..3ee150e Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地.png b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地.png new file mode 100644 index 0000000..12265e4 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/蓝晶土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/金土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/金土地-施肥.png new file mode 100644 index 0000000..3be5ea6 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/金土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/金土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/金土地-缺水.png new file mode 100644 index 0000000..4d64ec0 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/金土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/金土地.png b/legacy/zhenxun_plugin_farm/resource/soil/金土地.png new file mode 100644 index 0000000..9ea4f17 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/金土地.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/黑土地-施肥.png b/legacy/zhenxun_plugin_farm/resource/soil/黑土地-施肥.png new file mode 100644 index 0000000..7d8cd3c Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/黑土地-施肥.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/黑土地-缺水.png b/legacy/zhenxun_plugin_farm/resource/soil/黑土地-缺水.png new file mode 100644 index 0000000..bd7601f Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/黑土地-缺水.png differ diff --git a/legacy/zhenxun_plugin_farm/resource/soil/黑土地.png b/legacy/zhenxun_plugin_farm/resource/soil/黑土地.png new file mode 100644 index 0000000..a8a0991 Binary files /dev/null and b/legacy/zhenxun_plugin_farm/resource/soil/黑土地.png differ diff --git a/legacy/zhenxun_plugin_farm/utils/__init__.py b/legacy/zhenxun_plugin_farm/utils/__init__.py new file mode 100644 index 0000000..a66b575 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/__init__.py @@ -0,0 +1,41 @@ +from . import utils + + +def getConfig(): + from . import config + + return config + + +def getDrawFarm(): + from .darw.drawFarm import CDarwFarm + + return CDarwFarm + + +def getRequestManager(): + from .request import CRequestManager + + return CRequestManager + + +def getToolManager(): + from .tool import CToolManager + + return CToolManager + + +def getJsonManager(): + from .json import g_pJsonManager + + return g_pJsonManager + + +__all__ = [ + "getConfig", + "getDrawFarm", + "getJsonManager", + "getRequestManager", + "getToolManager", + "utils", +] diff --git a/legacy/zhenxun_plugin_farm/utils/config.py b/legacy/zhenxun_plugin_farm/utils/config.py new file mode 100644 index 0000000..18386c9 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/config.py @@ -0,0 +1,135 @@ +from pathlib import Path + +from zhenxun.configs.path_config import DATA_PATH + +# 签到状态 +g_bSignStatus = True + +# 是否处于Debug模式 +g_bIsDebug = False + +# 数据库文件目录 +g_sDBPath = DATA_PATH / "farm_db" + +# 数据库文件路径 +g_sDBFilePath = DATA_PATH / "farm_db/farm.db" + +# 农场资源文件目录 +g_sResourcePath = Path(__file__).resolve().parent / "../resource" + +# 农场作物数据库 +g_sPlantPath = g_sResourcePath / "db/plant.db" + +# 农场配置文件目录 +g_sConfigPath = Path(__file__).resolve().parent / "../config" + +# 农场签到文件路径 +g_sSignInPath = g_sConfigPath / "sign_in.json" + +# 土地等级上限 +g_iSoilLevelMax = 3 + +# 农场同一文本 +g_sTranslation = { + "basic": { + "notFarm": "尚未开通农场,快at我发送 开通农场 开通吧 🌱🚜", + "point": "你的当前农场币为: {point} 🌾💰", + "vipPoint": "你的当前点券为: {vipPoint} 🌾💰", + "error": "❌ 农场功能异常,请稍后再试 💔", + }, + "register": { + "success": "✅ 农场开通成功!\n💼 初始资金:{point}农场币 🥳🎉", + "repeat": "🎉 您已经开通农场啦~ 😄", + "error": "⚠️ 开通失败,请稍后再试 💔", + "already": "🚜 你已经开通农场啦~ 快去种田吧 🌱", + }, + "buySeed": { + "notSeed": "🌱 请在指令后跟需要购买的种子名称", + "notNum": "❗️ 请输入购买数量!", + "noLevel": "🔒 你的等级不够哦,努努力吧 💪", + "noPoint": "💰 你的农场币不够哦~ 快速速氪金吧!💸", + "noVipPoint": "💰 你的点券不够哦~ 快速速氪金吧!💸", + "success": "✅ 成功购买{name},花费{total}农场币,剩余{point}农场币 🌾", + "vipSuccess": "✅ 成功购买{name},花费{total}点券,剩余{point}点券 🌾", + "errorSql": "❌ 购买失败,执行数据库错误!🛑", + "error": "❌ 购买出错!请检查需购买的种子名称!🔍", + }, + "sowing": { + "notSeed": "🌱 请在指令后跟需要播种的种子名称", + "noSeed": "❌ 没有在你的仓库发现{name}种子,快去买点吧!🛒", + "noNum": "⚠️ 播种失败!仓库中的{name}种子数量不足,当前剩余{num}个种子 🍂", + "success": "✅ 播种{name}成功!仓库剩余{num}个种子 🌱", + "success2": "✅ 播种数量超出开垦土地数量,已将可播种土地成功播种{name}!仓库剩余{num}个种子 🌾", + "error": "❌ 播种失败,请稍后重试!⏳", + }, + "harvest": { + "append": "🌾 收获作物:{name},数量为:{num},经验为:{exp} ✨", + "exp": "✨ 累计获得经验:{exp} 📈", + "no": "🤷‍♂️ 没有可收获的作物哦~ 不要试图拔苗助长 🚫", + "error": "❌ 收获失败,请稍后重试!⏳", + }, + "eradicate": { + "success": "🗑️ 成功铲除荒废作物,累计获得经验:{exp} ✨", + "error": "❌ 没有可以铲除的作物 🚜", + }, + "reclamation": { + "confirm": "⚠️ 回复“是”将执行开垦 ⛏️", + "timeOut": "⏰ 等待开垦回复超时,请重试", + "perfect": "🌟 你已经开垦了全部土地 🎉", + "next": "🔜 下次开垦所需条件:等级:{level},农场币:{num} 💰", + "next2": "🔜 下次开垦所需条件:等级:{level},农场币:{num},物品:{item} 📦", + "nextLevel": "📈 当前用户等级{level},升级所需等级为{next} ⏳", + "noNum": "💰 当前用户农场币不足,升级所需农场币为{num} 💸", + "success": "✅ 开垦土地成功!🌱", + "error": "❌ 获取开垦土地条件失败!", + "error1": "❌ 执行开垦失败!", + "error2": "❌ 未知错误{e}💥", + }, + "sellPlant": { + "no": "🤷‍♀️ 你仓库没有可以出售的作物 🌾", + "success": "💰 成功出售所有作物,获得农场币:{point},当前农场币:{num} 🎉", + "success1": "💰 成功出售{name},获得农场币:{point},当前农场币:{num} 🥳", + "error": "❌ 出售作物{name}出错:仓库中不存在该作物 🚫", + "error1": "❌ 出售作物{name}出错:数量不足 ⚠️", + }, + "stealing": { + "noTarget": "🎯 请在指令后跟需要at的人 👤", + "targetNotFarm": "🚜 目标尚未开通农场,快邀请ta开通吧 😉", + "max": "❌ 你今天可偷次数到达上限啦,手下留情吧 🙏", + "info": "🤫 成功偷到作物:{name},数量为:{num} 🍒", + "noPlant": "🌱 目标没有作物可以被偷 🌾", + "repeat": "🚫 你已经偷过目标啦,请手下留情 🙏", + }, + "changeName": { + "noName": "✏️ 请在指令后跟需要更改的农场名", + "success": "✅ 更新农场名成功!🎉", + "error": "❌ 农场名不支持特殊符号!🚫", + "error1": "❌ 更新农场名失败!💔", + }, + "signIn": { + "success": "📝 签到成功!累计签到天数:{day}\n🎁 获得经验{exp},获得金币{num} 💰", + "grandTotal": "\n🎉 成功领取累计签到奖励:\n✨ 额外获得经验{exp},额外获得金币{num} 🥳", + "grandTotal1": ",额外获得点券{num} 🎫", + "grandTotal2": "\n🌱 获得{name}种子 * {num} 🌟", + "error": "❗️ 签到功能异常!", + "error1": "❌ 签到失败!未知错误 💔", + }, + "soilInfo": { + "success": "土地成功升级至{name},效果为:{text}", + "timeOut": "等待土地升级回复超时,请重试", + "error": "土地信息尚未查询到", + "error1": "该土地已经升至满级啦~", + "red": "增产+10%", + "black": "增产+20% 时间-20%", + "gold": "增产+28% 经验+28% 时间-20%", + "amethyst": "增产+30% 经验+30% 时间-25% 幸运+1%", + "aquamarine": "增产+32% 经验+32% 时间-28% 幸运+1%", + "blackcrystal": "增产+32% 经验+40% 时间-28% 幸运+2%", + }, + "lockPlant": { + "noPlant": "很抱歉,你的作物仓库中没有该作物", + "lockPlant": "加锁成功,现在{name}不会被一键售卖了", + "unlockPlant": "解锁成功,现在{name}会被一键售卖了", + "error": "未知错误", + }, +} diff --git a/legacy/zhenxun_plugin_farm/utils/darw/__init__.py b/legacy/zhenxun_plugin_farm/utils/darw/__init__.py new file mode 100644 index 0000000..6e0535d --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/darw/__init__.py @@ -0,0 +1,3 @@ +from .drawFarm import CDarwFarm + +__all__ = ["CDarwFarm"] diff --git a/legacy/zhenxun_plugin_farm/utils/darw/drawFarm.py b/legacy/zhenxun_plugin_farm/utils/darw/drawFarm.py new file mode 100644 index 0000000..c4e362b --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/darw/drawFarm.py @@ -0,0 +1,491 @@ +from zhenxun.configs.config import Config +from zhenxun.services.log import logger +from zhenxun.utils._build_image import BuildImage +from zhenxun.utils.image_utils import ImageTemplate +from zhenxun.utils.platform import PlatformUtils + +from ...core import CPlayer +from ...core.dbService import g_pDBService +from .. import config, getJsonManager, getToolManager, utils + + +class CDarwFarm: + @classmethod + async def drawFarmByUid(cls, uid: str) -> bytes: + """绘制用户农场 + + Args: + uid (str): 用户UID + + Returns: + bytes: 返回绘制结果 + """ + dynamic = Config.get_config("zhenxun_plugin_farm", "动态背景") + + img, soilSize, soilPos, grass = await cls.createBaseCanvas(dynamic) + + player = await getToolManager().getPlayerByUid(uid) + if not player: + return img.pic2bytes() + + soilUnlock = int(player.user.get("soil", 3)) + + isFirstExpansion = True # 首次添加扩建图片 + isFirstRipe = True + + for index in range(0, 30): + x = soilPos[str(index + 1)]["x"] + y = soilPos[str(index + 1)]["y"] + + # 已解锁格子 + if index < soilUnlock: + isRipe = await cls.drawUnlockedTile(img, uid, index + 1, x, y, soilSize) + if isRipe and isFirstRipe: + await cls.pasteRipeOnce(img, x, y, soilSize) + isFirstRipe = False + else: + addedExpansion = await cls.drawLockedTile( + img, x, y, soilSize, grass, isFirstExpansion + ) + if addedExpansion: + isFirstExpansion = False + + await cls.drawUserInfo(img, player, uid) + + await cls.applyDefinitionResize(img) + + return img.pic2bytes() + + @classmethod + async def createBaseCanvas( + cls, dynamic: bool + ) -> tuple[BuildImage, tuple, dict, BuildImage]: + """创建基础画布并返回 (img, soilSize, soilPos, grass) + + Returns: + tuple: (主画布, 土地尺寸, 土地坐标映射, 草地图) + """ + + if dynamic: + season = getToolManager().getSeason() + + backgroundPath = config.g_sResourcePath / "background/decorateIcon" + + # 节日优先级更高 + if season == utils.Season.SPRING: + bgFile = backgroundPath / "decorate_spring_1.jpg" + elif season == utils.Season.SUMMER: + bgFile = backgroundPath / "decorate_summer_1.jpg" + elif season == utils.Season.AUTUMN: + bgFile = backgroundPath / "decorate_autumn_1.jpg" + elif season == utils.Season.WINTER: + bgFile = backgroundPath / "decorate_winter_1.jpg" + else: + bgFile = backgroundPath / "decorate_default_1.jpg" + + img = BuildImage(background=bgFile) + else: + img = BuildImage( + background=config.g_sResourcePath + / "background/decorateIcon/decorate_default_1jpg" + ) + + soil = await getJsonManager().getSoil() + soilSize = soil["size"] + soilPos = soil["soil"] + + grass = BuildImage(background=config.g_sResourcePath / "soil/草土地.png") + await grass.resize(0, soilSize[0], soilSize[1]) + + return img, soilSize, soilPos, grass + + @classmethod + async def drawUnlockedTile( + cls, img: BuildImage, uid: str, soilIndex: int, x: int, y: int, soilSize + ) -> bool: + """绘制已解锁土地格(包含土地贴图与作物),返回该格是否可收获 + + Args: + img (BuildImage): 主画布 + uid (str): 用户UID + soilIndex (int): 土地索引(从1开始) + x (int), y (int): 贴图位置 + soilSize: 土地贴图尺寸([w,h] 或 (w,h)) + + Returns: + bool: 是否有可收获作物(isRipe) + """ + soilUrl = "soil/普通土地.png" + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, soilIndex) + + if soilInfo: + soilLevel = soilInfo.get("soilLevel", 0) + if soilLevel == 1: + soilUrl = "soil/红土地.png" + elif soilLevel == 2: + soilUrl = "soil/黑土地.png" + elif soilLevel == 3: + soilUrl = "soil/金土地.png" + + soil = BuildImage(background=config.g_sResourcePath / soilUrl) + await soil.resize(0, soilSize[0], soilSize[1]) + await img.paste(soil, (x, y)) + + isPlant, plant, isRipe, offsetX, offsetY = await cls.drawSoilPlant( + uid, soilIndex + ) + if isPlant and plant is not None: + await img.paste( + plant, + ( + x + soilSize[0] // 2 - plant.width // 2 + offsetX, + y + soilSize[1] // 2 - plant.height // 2 + offsetY, + ), + ) + + return bool(isRipe) + + @classmethod + async def drawLockedTile( + cls, + img: BuildImage, + x: int, + y: int, + soilSize, + grass: BuildImage, + isFirstExpansion: bool, + ) -> bool: + """绘制未解锁格子并在首次出现时绘制扩建图标 + + Returns: + bool: 是否在此格绘制了扩建图标(仅首次返回 True) + """ + await img.paste(grass, (x, y)) + + if isFirstExpansion: + expansion = BuildImage( + background=config.g_sResourcePath / "background/expansion.png" + ) + await expansion.resize(0, 69, 69) + await img.paste( + expansion, + ( + x + soilSize[0] // 2 - expansion.width // 2, + y + soilSize[1] // 2 - expansion.height, + ), + ) + return True + + return False + + @classmethod + async def pasteRipeOnce(cls, img: BuildImage, x: int, y: int, soilSize): + """首次发现成熟作物时贴上成熟提示图(ripe)""" + ripe = BuildImage(background=config.g_sResourcePath / "background/ripe.png") + await img.paste( + ripe, + (x + soilSize[0] // 2 - ripe.width // 2, y - ripe.height // 2), + ) + + @classmethod + async def drawUserInfo(cls, img: BuildImage, player: CPlayer, uid: str): + """绘制左上角用户信息(头像、框、昵称、经验、等级、货币等) + TODO 需要详细的绘制头像框 + + Args: + img (BuildImage): 主画布 + player(CPlayer): 用户 + uid (str): 用户Uid + """ + # 背景板 + background = BuildImage( + background=config.g_sResourcePath / "background/userInfo.png" + ) + await img.paste(background, (100, 30)) + + # 头像 + image = await PlatformUtils.get_user_avatar(uid, "qq") + if image: + avatar = BuildImage(background=image) + await avatar.resize(0, 140, 150) + await img.paste(avatar, (125, 85)) + + # 头像框 + frame = BuildImage( + background=config.g_sResourcePath / "background/frame/frame.png" + ) + await img.paste(frame, (75, 44)) + + nameImg = await BuildImage.build_text_image( + player.user["name"], size=24, font_color=(77, 35, 4) + ) + await img.paste(nameImg, (300, 92)) + + level = await player.getUserLevel() + beginX = 309 + endX = 627 + width = int((level[2] / level[1]) * (endX - beginX)) if level[1] else 0 + await img.rectangle((beginX, 188, beginX + width, 222), (171, 194, 41)) + + # 经验 + expImg = await BuildImage.build_text_image( + f"{level[2]} / {level[1]}", size=24, font_color=(102, 120, 19) + ) + await img.paste(expImg, (390, 193)) + + # 等级 + levelImg = await BuildImage.build_text_image( + str(level[0]), size=32, font_color=(214, 111, 1) + ) + await img.paste(levelImg, (660, 187)) + + # 农场币 + pointImg = await BuildImage.build_text_image( + str(player.user.get("point", 0)), size=24, font_color=(253, 253, 253) + ) + await img.paste(pointImg, (330, 255)) + + # 点券 + bondsImg = await BuildImage.build_text_image( + "0", size=24, font_color=(253, 253, 253) + ) + await img.paste(bondsImg, (570, 255)) + + @classmethod + async def drawUserDecorateIcon(cls, img: BuildImage, player: CPlayer) -> bool: + """绘制用户装饰图标 + + Args: + img (BuildImage): 主画布 + player (CPlayer): 用户 + + Returns: + bool: 是否成功绘制 + """ + + decorateIconId = player.user.get("decorateIcon", 0) + if decorateIconId <= 0: + return False + + iconPath = ( + config.g_sResourcePath / f"decorateIcon/DecorateIcon{decorateIconId}.png" + ) + if not iconPath.exists(): + return False + + icon = BuildImage(background=iconPath) + await icon.resize(0, 100, 100) + await img.paste(icon, (x, y)) + + return True + + @classmethod + async def applyDefinitionResize(cls, img: BuildImage): + """根据配置调整绘制清晰度(original/medium/hight/其他)""" + definition = Config.get_config("zhenxun_plugin_farm", "绘制农场清晰度") + if definition == "medium": + await img.resize(0.6) + elif definition == "hight": + await img.resize(0.8) + elif definition == "original": + pass + else: + await img.resize(0.4) + + @classmethod + async def drawDetailFarmByUid(cls, uid: str) -> list: + """绘制用户详细信息 + + Args: + uid (str): 用户Uid + + Returns: + list: + """ + + info = [] + farm = await cls.drawFarmByUid(uid) + player = await getToolManager().getPlayerByUid(uid) + if not player: + return info + + info.append(BuildImage.open(farm)) + + dataList = [] + columnName = [ + "-", + "土地ID", + "土地等级", + "作物名称", + "成熟时间", + "土地状态", + "被偷数量", + "剩余产出", + ] + + icon = "" + soilNumber = player.user.get("soil", 3) + + for i in range(1, soilNumber + 1): + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, i) + + if not soilInfo: + continue + + match soilInfo.get("soilLevel", 0): + case 1: + name = "红土地.png" + case 2: + name = "黑土地.png" + case 3: + name = "金土地.png" + case _: + name = "普通土地.png" + iconPath = config.g_sResourcePath / "soil" / name + + if iconPath.exists(): + icon = (iconPath, 33, 33) + + plantName = soilInfo.get("plantName", "-") + + if plantName == "-": + matureTime = "-" + soilStatus = "-" + totalNumber = "-" + plantNumber = "-" + else: + matureTime = ( + getToolManager() + .dateTime() + .fromtimestamp(int(soilInfo.get("matureTime", 0))) + .strftime("%Y-%m-%d %H:%M:%S") + ) + soilStatus = await g_pDBService.userSoil.getUserSoilStatus(uid, i) + + totalNumber = await g_pDBService.userSteal.getTotalStolenCount(uid, i) + planInfo = await g_pDBService.plant.getPlantByName(plantName) + + if not planInfo: + plantNumber = "None" + else: + plantNumber = f"{planInfo['harvest'] - totalNumber}" + + dataList.append( + [ + icon, + i, + await g_pDBService.userSoil.getSoilLevelText(soilInfo["soilLevel"]), + plantName, + matureTime, + soilStatus, + totalNumber, + plantNumber, + ] + ) + + if len(dataList) >= 15: + result = await ImageTemplate.table_page( + "土地详细信息", + "", + columnName, + dataList, + ) + + info.append(result.copy()) + dataList.clear() + + if i >= soilNumber: + result = await ImageTemplate.table_page( + "土地详细信息", + "", + columnName, + dataList, + ) + + info.append(result.copy()) + dataList.clear() + + return info + + @classmethod + async def drawSoilPlant( + cls, uid: str, soilIndex: int + ) -> tuple[bool, BuildImage, bool, int, int]: + """绘制植物资源 + + Args: + uid (str): 用户Uid + soilIndex (int): 土地索引 从1开始 + + Returns: + tuple[bool, BuildImage]: [绘制是否成功,资源图片, 是否成熟] + """ + + plant = None + soilInfo = await g_pDBService.userSoil.getUserSoil(uid, soilIndex) + + if not soilInfo: + return False, None, False, 0, 0 # type: ignore + + # 是否枯萎 + if int(soilInfo.get("wiltStatus", 0)) == 1: + plant = BuildImage(background=config.g_sResourcePath / "plant/basic/9.png") + await plant.resize(0, 150, 212) + return True, plant, False, 0, 0 + + # 获取作物详细信息 + plantInfo = await g_pDBService.plant.getPlantByName(soilInfo["plantName"]) + if not plantInfo: + logger.error(f"绘制植物资源失败: {soilInfo['plantName']}") + return False, None, False, 0, 0 # type: ignore + + offsetX = plantInfo.get("officX", 0) + offsetY = plantInfo.get("officY", 0) + offsetW = plantInfo.get("officW", 0) + offsetH = plantInfo.get("officH", 0) + + currentTime = getToolManager().dateTime().now().timestamp() + phaseList = await g_pDBService.plant.getPlantPhaseByName(soilInfo["plantName"]) + + # 如果当前时间大于成熟时间 说明作物成熟 + if currentTime >= soilInfo["matureTime"]: + plant = BuildImage( + background=config.g_sResourcePath + / f"plant/{soilInfo['plantName']}/{len(phaseList)}.png" + ) + + return True, plant, True, offsetX, offsetY + else: + # 如果是多阶段作物 且没有成熟 #早期思路 多阶段作物 直接是倒数第二阶段图片 + # if soilInfo["harvestCount"] >= 1: + # plant = BuildImage( + # background=g_sResourcePath + # / f"plant/{soilInfo['plantName']}/{plantInfo['phase'] - 1}.png" + # ) + + # return True, plant, False, offsetX, offsetY + + # 如果没有成熟 则根据当前阶段进行绘制 + elapsedTime = currentTime - soilInfo["plantTime"] + currentStage = currentStage = sum( + 1 for thr in phaseList if elapsedTime >= thr + ) + + if currentStage <= 0: + if not plantInfo["general"]: + plant = BuildImage( + background=config.g_sResourcePath + / f"plant/{soilInfo['plantName']}/0.png" + ) + else: + plant = BuildImage( + background=config.g_sResourcePath / "plant/basic/0.png" + ) + await plant.resize(0, 35 + offsetW, 58 + offsetH) + else: + plant = BuildImage( + background=config.g_sResourcePath + / f"plant/{soilInfo['plantName']}/{currentStage}.png" + ) + + return True, plant, False, offsetX, offsetY diff --git a/legacy/zhenxun_plugin_farm/utils/json.py b/legacy/zhenxun_plugin_farm/utils/json.py new file mode 100644 index 0000000..2e5c488 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/json.py @@ -0,0 +1,146 @@ +import json + +from zhenxun.services.log import logger + +from . import config, getRequestManager + + +class CJsonManager: + def __init__(self): + self._m_pItem = {} + self._m_pLevel = {} + self._m_pSoil = {} + self._m_pSign = {} + + self._m_bItemLoaded = False + self._m_bLevelLoaded = False + self._m_bSoilLoaded = False + self._m_bSignLoaded = False + + async def getItem(self) -> dict: + if not self._m_bItemLoaded: + success = await self.initItem() + if not success: + return {} + return self._m_pItem + + async def getLevel(self) -> dict: + if not self._m_bLevelLoaded: + success = await self.initLevel() + if not success: + return {} + return self._m_pLevel + + async def getSoil(self) -> dict: + if not self._m_bSoilLoaded: + success = await self.initSoil() + if not success: + return {} + return self._m_pSoil + + async def getSign(self) -> dict: + if not self._m_bSignLoaded: + success = await self.initSign() + if not success: + return {} + return self._m_pSign + + async def reloadItem(self) -> bool: + self._m_bItemLoaded = False + return await self.initItem() + + async def reloadLevel(self) -> bool: + self._m_bLevelLoaded = False + return await self.initLevel() + + async def reloadSoil(self) -> bool: + self._m_bSoilLoaded = False + return await self.initSoil() + + async def reloadSign(self) -> bool: + self._m_bSignLoaded = False + return await self.initSign() + + async def initItem(self) -> bool: + try: + with open( + config.g_sConfigPath / "item.json", + encoding="utf-8", + ) as file: + self._m_pItem = json.load(file) + self._m_bItemLoaded = True + return True + except FileNotFoundError: + logger.warning("item.json 打开失败") + self._m_pItem = {} + return False + except json.JSONDecodeError as e: + logger.warning(f"item.json JSON格式错误: {e}") + self._m_pItem = {} + return False + + async def initLevel(self) -> bool: + try: + with open( + config.g_sConfigPath / "level.json", + encoding="utf-8", + ) as file: + self._m_pLevel = json.load(file) + self._m_bLevelLoaded = True + return True + except FileNotFoundError: + logger.warning("level.json 打开失败") + self._m_pLevel = {} + return False + except json.JSONDecodeError as e: + logger.warning(f"level.json JSON格式错误: {e}") + self._m_pLevel = {} + return False + + async def initSoil(self) -> bool: + try: + with open( + config.g_sConfigPath / "soil.json", + encoding="utf-8", + ) as file: + self._m_pSoil = json.load(file) + self._m_bSoilLoaded = True + return True + except FileNotFoundError: + logger.warning("soil.json 打开失败") + self._m_pSoil = {} + return False + except json.JSONDecodeError as e: + logger.warning(f"soil.json JSON格式错误: {e}") + self._m_pSoil = {} + return False + + async def initSignInFile(self) -> bool: + if not await getRequestManager().initSignInFile(): + config.g_bSignStatus = False + return False + else: + result = await self.initSign() + config.g_bSignStatus = result + return result + + async def initSign(self) -> bool: + try: + with open( + config.g_sSignInPath, + encoding="utf-8", + ) as file: + self._m_pSign = json.load(file) + self._m_bSignLoaded = True + return True + except FileNotFoundError: + logger.warning("sign_in.json 打开失败") + self._m_pSign = {} + return False + except json.JSONDecodeError as e: + logger.warning(f"sign_in.json JSON格式错误: {e}") + self._m_pSign = {} + return False + + +g_pJsonManager = CJsonManager() diff --git a/legacy/zhenxun_plugin_farm/utils/request.py b/legacy/zhenxun_plugin_farm/utils/request.py new file mode 100644 index 0000000..04e77a7 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/request.py @@ -0,0 +1,289 @@ +import json +import os + +import httpx +from rich.progress import ( + BarColumn, + DownloadColumn, + Progress, + TextColumn, + TimeRemainingColumn, + TransferSpeedColumn, +) + +from zhenxun.configs.config import Config +from zhenxun.services.log import logger + +from ..core.dbService import g_pDBService +from . import config, getToolManager + + +class CRequestManager: + m_sTokens = os.environ.get("FARM_SERVICE_TOKEN", "") + + @classmethod + async def download( + cls, + url: str, + savePath: str, + fileName: str, + params: dict | None = None, + jsonData: dict | None = None, + ) -> bool: + """下载文件到指定路径并覆盖已存在的文件 + + Args: + url (str): 文件的下载链接 + savePath (str): 保存文件夹路径 + fileName (str): 保存后的文件名 + params (dict | None): 可选的 URL 查询参数 + jsonData (dict | None): 可选的 JSON 请求体 + + Returns: + bool: 是否下载成功 + """ + headers = {"token": cls.m_sTokens} + + try: + async with httpx.AsyncClient(timeout=30.0) as client: + requestArgs: dict = {"headers": headers} + if params: + requestArgs["params"] = params + if jsonData: + requestArgs["json"] = jsonData + + response = await client.request( + "GET", url, **requestArgs, follow_redirects=True + ) + + if response.status_code != 200: + logger.warning( + f"文件下载失败: HTTP {response.status_code} {response.text}" + ) + return False + + totalLength = int(response.headers.get("Content-Length", 0)) + fullPath = os.path.join(savePath, fileName) + os.makedirs(os.path.dirname(fullPath), exist_ok=True) + + with Progress( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + DownloadColumn(), + TransferSpeedColumn(), + TimeRemainingColumn(), + transient=True, + ) as progress: + task = progress.add_task( + f"[green]【真寻农场】正在下载 {fileName}", total=totalLength + ) + + with open(fullPath, "wb") as f: + async for chunk in response.aiter_bytes(chunk_size=1024): + f.write(chunk) + progress.advance(task, len(chunk)) + + return True + + except Exception as e: + logger.warning(f"下载文件异常: {e}") + return False + + @classmethod + async def post(cls, endpoint: str, name: str = "", jsonData: dict = {}) -> dict: + """发送POST请求到指定接口,统一调用,仅支持JSON格式数据 + + Args: + endpoint (str): 请求的接口路径 + name (str, optional): 操作名称用于日志记录 + jsonData (dict): 以JSON格式发送的数据 + + Raises: + ValueError: 当jsonData未提供时抛出 + + Returns: + dict: 返回请求结果的JSON数据 + """ + baseUrl = Config.get_config("zhenxun_plugin_farm", "服务地址") + url = f"{baseUrl.rstrip('/')}:8998/{endpoint.lstrip('/')}" + headers = {"token": cls.m_sTokens} + + try: + async with httpx.AsyncClient(timeout=5.0) as client: + response = await client.post(url, json=jsonData, headers=headers) + + if response.status_code == 200: + return response.json() + else: + logger.warning( + f"{name}请求失败: HTTP {response.status_code} {response.text}" + ) + return {} + except httpx.RequestError as e: + logger.warning(f"{name}请求异常", e=e) + return {} + except Exception as e: + logger.warning(f"{name}处理异常", e=e) + return {} + + @classmethod + async def get(cls, endpoint: str, name: str = "") -> dict: + """发送GET请求到指定接口,统一调用,仅支持无体的查询 + + Args: + endpoint (str): 请求的接口路径 + name (str, optional): 操作名称用于日志记录 + + Returns: + dict: 返回请求结果的JSON数据 + """ + baseUrl = Config.get_config("zhenxun_plugin_farm", "服务地址") + url = f"{baseUrl.rstrip('/')}:8998/{endpoint.lstrip('/')}" + headers = {"token": cls.m_sTokens} + + try: + async with httpx.AsyncClient(timeout=5.0) as client: + response = await client.get(url, headers=headers) + + if response.status_code == 200: + return response.json() + else: + logger.warning( + f"{name}请求失败: HTTP {response.status_code} {response.text}" + ) + return {} + except httpx.RequestError as e: + logger.warning(f"{name}请求异常", e=e) + return {} + except Exception as e: + logger.warning(f"{name}处理异常", e=e) + return {} + + @classmethod + async def initSignInFile(cls) -> bool: + if os.path.exists(config.g_sSignInPath): + try: + with open(config.g_sSignInPath, encoding="utf-8") as f: + content = f.read() + sign = json.loads(content) + + date = sign.get("date", "") + yearMonth = getToolManager().dateTime().now().strftime("%Y%m") + + if date == yearMonth: + logger.debug("真寻农场签到文件检查完毕") + return True + else: + logger.warning("真寻农场签到文件检查失败, 即将下载") + return await cls.downloadSignInFile() + except json.JSONDecodeError: + logger.warning("真寻农场签到文件格式错误, 即将下载") + return await cls.downloadSignInFile() + else: + return await cls.downloadSignInFile() + + @classmethod + async def downloadSignInFile(cls) -> bool: + """下载签到文件,并重命名为 sign_in.json + + Returns: + bool: 是否下载成功 + """ + try: + baseUrl = Config.get_config("zhenxun_plugin_farm", "服务地址") + url = f"{baseUrl.rstrip('/')}:8998/sign_in" + path = str(config.g_sSignInPath.parent.resolve(strict=False)) + yearMonth = getToolManager().dateTime().now().strftime("%Y%m") + + # 下载为 signTemp.json + success = await cls.download( + url=url, + savePath=path, + fileName="signTemp.json", + jsonData={"date": yearMonth}, + ) + + if not success: + return False + + # 重命名为 sign_in.json + getToolManager().renameFile(f"{path}/signTemp.json", "sign_in.json") + return True + except Exception as e: + logger.error("下载签到文件失败", e=e) + return False + + @classmethod + async def initPlantDBFile(cls) -> bool: + """检查本地 plant.db 版本,如远程版本更新则重新下载 + + Returns: + bool: 是否为最新版或成功更新 + """ + versionPath = os.path.join(os.path.dirname(config.g_sPlantPath), "version.json") + + try: + with open(versionPath, encoding="utf-8") as f: + localVersion = json.load(f).get("version", 0) + except Exception as e: + logger.warning(f"读取本地版本失败,默认版本为0: {e}") + localVersion = 0 + + remoteInfo = await cls.get("plant_version", name="版本检查") + remoteVersion = remoteInfo.get("version") + + if remoteVersion is None: + logger.warning("获取远程版本失败") + return False + + if float(remoteVersion) <= float(localVersion): + logger.debug("plant.db 已为最新版本") + return True + + logger.warning( + f"发现新版本 plant.db(远程: {remoteVersion} / 本地: {localVersion}),开始更新..." + ) + + # 先断开数据库连接 + await g_pDBService.cleanup() + + return await cls.downloadPlantDBFile(remoteVersion) + + @classmethod + async def downloadPlantDBFile(cls, remoteVersion: float) -> bool: + """下载最新版 plant.db 并更新本地 version.json + + Args: + remoteVersion (float): 远程版本号 + + Returns: + bool: 是否下载并更新成功 + """ + baseUrl = Config.get_config("zhenxun_plugin_farm", "服务地址") + + savePath = os.path.dirname(config.g_sPlantPath) + success = await cls.download( + url=f"{baseUrl.rstrip('/')}:8998/file/plant.db", + savePath=savePath, + fileName="plantTemp.db", + ) + + if not success: + return False + + # 重命名为 sign_in.json + getToolManager().renameFile(f"{savePath}/plantTemp.db", "plant.db") + + versionPath = os.path.join(savePath, "version.json") + try: + with open(versionPath, "w", encoding="utf-8") as f: + json.dump({"version": remoteVersion}, f) + logger.debug("版本文件已更新") + except Exception as e: + logger.warning(f"写入版本文件失败: {e}") + return False + + await g_pDBService.plant.init() + await g_pDBService.plant.downloadPlant() + + return True diff --git a/legacy/zhenxun_plugin_farm/utils/tool.py b/legacy/zhenxun_plugin_farm/utils/tool.py new file mode 100644 index 0000000..6c854c6 --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/tool.py @@ -0,0 +1,236 @@ +from datetime import datetime +import os +from pathlib import Path +from zoneinfo import ZoneInfo + +from jinja2 import Template +from playwright.async_api import async_playwright +from zhdate import ZhDate + +from zhenxun.services.log import logger +from zhenxun.utils.message import MessageUtils + +from ..core import CPlayer, g_pUserPool +from . import utils + + +class CToolManager: + @classmethod + async def repeat(cls): + await MessageUtils.build_message( + "尚未开通农场,快at我发送 开通农场 开通吧" + ).send() + + @classmethod + async def getPlayerByUid(cls, uid: str) -> CPlayer | None: + player = g_pUserPool.getUser(uid) + if player is None: + player = CPlayer() + if not await player.init(uid): + return None + g_pUserPool.createUser(uid, player) + + return player + + @classmethod + def sanitize_username(cls, username: str, max_length: int = 15) -> str: + """ + 安全处理用户名 + 功能: + 1. 移除首尾空白 + 2. 过滤危险字符 + 3. 转义单引号 + 4. 处理空值 + 5. 限制长度 + """ + # 处理空值 + if not username: + return "神秘农夫" + + # 基础清洗 + cleaned = username.strip() + + # 允许的字符白名单(可自定义扩展) + # fmt: off + safe_chars = { + "_", "-", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", + "+", "=", ".", ",", "~", "·", " ", + "a","b","c","d","e","f","g","h","i","j","k","l","m", + "n","o","p","q","r","s","t","u","v","w","x","y","z", + "A","B","C","D","E","F","G","H","I","J","K","L","M", + "N","O","P","Q","R","S","T","U","V","W","X","Y","Z", + "0","1","2","3","4","5","6","7","8","9", + } + # fmt: on + # 添加常用中文字符(Unicode范围) + safe_chars.update(chr(c) for c in range(0x4E00, 0x9FFF + 1)) + + # 过滤危险字符 + filtered = [ + c if c in safe_chars or 0x4E00 <= ord(c) <= 0x9FFF else "" for c in cleaned + ] + + # 合并处理结果 + safe_str = "".join(filtered) + + # 转义单引号(双重保障) + escaped = safe_str.replace("'", "''") + + # 处理空结果 + if not escaped: + return "神秘农夫" + + # 长度限制 + return escaped[:max_length] + + @classmethod + def renameFile(cls, currentFilePath: str, newFileName: str) -> bool: + """重命名文件,如果目标文件名已存在则先删除再重命名 + + Args: + currentFilePath (str): 当前文件的完整路径 + newFileName (str): 重命名后的文件名 + + Returns: + bool: 重命名成功返回 True,否则返回 False + """ + try: + dirPath = os.path.dirname(currentFilePath) + newFilePath = os.path.join(dirPath, newFileName) + + if os.path.exists(newFilePath): + os.remove(newFilePath) + + os.rename(currentFilePath, newFilePath) + return True + except Exception as e: + logger.warning(f"文件重命名失败: {e}") + return False + + @classmethod + def dateTime(cls) -> datetime: + tz = ZoneInfo("Asia/Shanghai") + return datetime.now(tz) + + @classmethod + def getSeason(cls) -> utils.Season: + month = cls.dateTime().month + + if month in [3, 4, 5]: + return utils.Season.SPRING + elif month in [6, 7, 8]: + return utils.Season.SUMMER + elif month in [9, 10, 11]: + return utils.Season.AUTUMN + elif month in [12, 1, 2]: + return utils.Season.WINTER + else: + return utils.Season.NO + + @classmethod + def getFestival(cls) -> utils.Festival: + now = cls.dateTime() + + lunarDate = ZhDate.from_datetime(now) + lunarMonth = lunarDate.lunar_month + lunarDay = lunarDate.lunar_day + + festivalChecks = [ + (1, lambda: lunarMonth == 8 and lunarDay == 15), # 中秋节 + (2, lambda: (now.month, now.day) == (10, 1)), # 国庆节 + (3, lambda: lunarMonth == 1 and lunarDay == 15), # 元宵节 + (4, lambda: lunarMonth == 5 and lunarDay == 5), # 端午节 + (5, lambda: lunarMonth == 1 and lunarDay == 1), # 春节 + (6, lambda: (now.month, now.day) == (10, 31)), # 万圣节 + (7, lambda: (now.month, now.day) == (12, 25)), # 圣诞节 + (8, lambda: (now.month, now.day) == (1, 1)), # 新年 + (9, lambda: (now.month, now.day) == (2, 14)), # 情人节 + ] + + for code, checkFunc in festivalChecks: + if checkFunc(): + return utils.Festival(code) + + return utils.Festival.NO + + @classmethod + def renderHtmlToFile( + cls, path: Path | str, context: dict, output: Path | str + ) -> None: + """ + 使用 Jinja2 渲染 HTML 模板并保存到指定文件,会自动创建父目录 + + Args: + path (str): 模板 HTML 路径 + context (dict): 用于渲染的上下文字典 + output (str): 输出 HTML 文件路径 + """ + templatePath = str(path) + outputPath = str(output) + + templateStr = Path(templatePath).read_text(encoding="utf-8") + template = Template(templateStr) + rendered = template.render(**context) + + # 自动创建目录 + Path(outputPath).parent.mkdir(parents=True, exist_ok=True) + + Path(outputPath).write_text(rendered, encoding="utf-8") + + @classmethod + async def screenshotHtmlToBytes(cls, path: str) -> bytes: + """ + 使用 Playwright 截图本地 HTML 文件并返回 PNG 图片字节数据 + + Args: + path (str): 本地 HTML 文件路径 + + Returns: + bytes: PNG 图片的原始字节内容 + """ + async with async_playwright() as p: + browser = await p.chromium.launch() + page = await browser.new_page( + viewport={"width": 1200, "height": 900}, device_scale_factor=1 + ) + file_url = Path(path).resolve().as_uri() + await page.goto(file_url, wait_until="networkidle") + await page.evaluate("""() => { + return new Promise(r => setTimeout(r, 200)); + }""") + image_bytes = await page.screenshot(full_page=True) + await browser.close() + + return image_bytes + + @classmethod + async def screenshotSave( + cls, path: str, save: str, width: int, height: int + ) -> None: + """ + 使用 Playwright 渲染本地 HTML 并将截图保存到指定路径 + + Args: + path (str): HTML 文件路径 + save (str): PNG 保存路径(如 output/image.png) + width (int): 图片宽度 + height (int): 图片高度 + """ + async with async_playwright() as p: + browser = await p.chromium.launch() + page = await browser.new_page( + viewport={"width": width, "height": height}, device_scale_factor=1 + ) + + file_url = Path(path).resolve().as_uri() + await page.goto(file_url, wait_until="networkidle") + await page.evaluate("""() => { + return new Promise(r => setTimeout(r, 200)); + }""") + + # 确保保存目录存在 + Path(save).parent.mkdir(parents=True, exist_ok=True) + + # 截图并保存到本地文件 + await page.screenshot(path=save, full_page=True) + await browser.close() diff --git a/legacy/zhenxun_plugin_farm/utils/utils.py b/legacy/zhenxun_plugin_farm/utils/utils.py new file mode 100644 index 0000000..33d705c --- /dev/null +++ b/legacy/zhenxun_plugin_farm/utils/utils.py @@ -0,0 +1,22 @@ +from enum import Enum + + +class Festival(Enum): + NO = 0 # 无节日 + MIDAUTUMN = 1 # 中秋节 + NATIONALDAY = 2 # 国庆节 + LANTERNFESTIVAL = 3 # 元宵节 + DRAGONBOAT = 4 # 端午节 + SPRINGFESTIVAL = 5 # 春节 + HALLOWEEN = 6 # 万圣节 + CHRISTMAS = 7 # 圣诞节 + NEWYEAR = 8 # 新年 + VALENTINE = 9 # 情人节 + + +class Season(Enum): + NO = 0 # 无季节 + SPRING = 1 # 春季 + SUMMER = 2 # 夏季 + AUTUMN = 3 # 秋季 + WINTER = 4 # 冬季 diff --git a/release/README.md b/release/README.md new file mode 100644 index 0000000..0092cfd --- /dev/null +++ b/release/README.md @@ -0,0 +1,11 @@ +# 发布设计预留位置 + +targets.json 只记录用户提供的仓库与目标名称;enabled=false。 +没有可执行同步脚本、Actions、远程写凭据或发布授权。 + +主仓库构建的每个产物只含同版本核心、当前框架接入、所需资源和依赖。 +首次接管三个现有仓库需先比较已有内容,通过候选 PR 审查, +不得直接清空目标仓库或强推。 + +用户已要求停止拉取并删除本地克隆,当前不得重新检出这些仓库。 +完整规则见 docs/04-release-design.md。 diff --git a/release/targets.json b/release/targets.json new file mode 100644 index 0000000..d810897 --- /dev/null +++ b/release/targets.json @@ -0,0 +1,29 @@ +{ + "schema": "farm.release-targets.v1", + "status": "design-only", + "source_repository": null, + "network_actions_enabled": false, + "targets": [ + { + "name": "zhenxun", + "repository": "https://github.com/Shu-Ying/zhenxun_plugin_farm.git", + "observed_default_branch": "main", + "entry_directory": "integrations/zhenxun", + "enabled": false + }, + { + "name": "astrbot", + "repository": "https://github.com/Shu-Ying/astrbot_plugin_farm.git", + "observed_default_branch": "main", + "entry_directory": "integrations/astrbot", + "enabled": false + }, + { + "name": "nonebot", + "repository": "https://github.com/Shu-Ying/nonebot_plugin_farm.git", + "observed_default_branch": "main", + "entry_directory": "integrations/nonebot", + "enabled": false + } + ] +} diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..c37319a --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,8 @@ +# 本地工具 + +check_baseline.py 为已实现的离线校验工具。 +从任意目录运行均可按脚本位置找到主仓库;--root 可指定其他副本。 +检查清单哈希、缺失/新增文件、Python 3.10 语法、JSON 与静态作物库, +不导入旧插件、不联网、不读真实玩家库。 + +迁移、分包和远程同步工具尚未实施,不提供会覆盖仓库的占位脚本。 diff --git a/scripts/check_baseline.py b/scripts/check_baseline.py new file mode 100644 index 0000000..a9785f7 --- /dev/null +++ b/scripts/check_baseline.py @@ -0,0 +1,117 @@ +"""Validate the preserved legacy source without starting a bot.""" + +import argparse +import ast +from contextlib import closing +import hashlib +import json +from pathlib import Path, PurePosixPath +import sqlite3 +import sys + + +def check(root): + manifest = json.loads( + (root / "docs/legacy-manifest.json").read_text(encoding="utf-8") + ) + if manifest.get("schema") != "farm.legacy-baseline.v1": + raise ValueError("Unsupported baseline manifest schema") + baseline = (root / manifest["destination"]).resolve() + if not baseline.is_relative_to(root.resolve()): + raise ValueError("Baseline destination escapes repository") + errors = [] + expected = set() + python_count = 0 + json_count = 0 + for entry in manifest["files"]: + name = entry["path"] + relative = PurePosixPath(name) + if relative.is_absolute() or ".." in relative.parts: + raise ValueError("Invalid manifest path") + if name in expected: + raise ValueError("Duplicate manifest path") + expected.add(name) + path = (baseline / name).resolve() + if not path.is_relative_to(baseline): + raise ValueError("Manifest path escapes baseline") + if not path.is_file(): + errors.append({"path": name, "error": "missing file"}) + continue + content = path.read_bytes() + digest = hashlib.sha256(content).hexdigest() + if digest != entry["copied_sha256"]: + errors.append({"path": name, "error": "SHA-256 mismatch"}) + if len(content) != entry["bytes"]: + errors.append({"path": name, "error": "size mismatch"}) + if path.suffix == ".py": + python_count += 1 + try: + ast.parse(content, filename=name, feature_version=(3, 10)) + except SyntaxError as exc: + errors.append( + {"path": name, "error": "syntax", "line": exc.lineno} + ) + if path.suffix == ".json": + json_count += 1 + try: + json.loads(content) + except (ValueError, UnicodeError): + errors.append({"path": name, "error": "invalid JSON"}) + actual = { + path.relative_to(baseline).as_posix() + for path in baseline.rglob("*") + if path.is_file() + and "__pycache__" not in path.parts + and path.suffix != ".pyc" + } + for name in sorted(actual - expected): + errors.append({"path": name, "error": "unmanifested file"}) + catalogues = [] + for name in ("plant.db", "plant-test.db"): + path = baseline / "resource/db" / name + with closing( + sqlite3.connect( + path.resolve().as_uri() + "?mode=ro", uri=True + ) + ) as connection: + integrity = connection.execute("PRAGMA quick_check").fetchone()[0] + tables = sorted( + row[0] + for row in connection.execute( + "SELECT name FROM sqlite_master WHERE type='table'" + ) + ) + if integrity != "ok" or tables != ["plant", "sqlite_sequence"]: + errors.append({"path": name, "error": "unexpected catalogue"}) + catalogues.append( + {"name": name, "quick_check": integrity, "tables": tables} + ) + return { + "status": "passed" if not errors else "failed", + "files": len(expected), + "python_syntax_files": python_count, + "json_files": json_count, + "catalogues": catalogues, + "errors": errors, + "scope": "integrity and syntax only; no host or gameplay verified", + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--root", + type=Path, + default=Path(__file__).resolve().parents[1], + ) + args = parser.parse_args() + try: + result = check(args.root.resolve()) + except (OSError, ValueError, KeyError, sqlite3.Error) as exc: + result = {"status": "failed", "error_type": type(exc).__name__} + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 if result["status"] == "passed" else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/farm_core/README.md b/src/farm_core/README.md new file mode 100644 index 0000000..6a9ac50 --- /dev/null +++ b/src/farm_core/README.md @@ -0,0 +1,6 @@ +# 共享核心预留位置 + +当前只有职责说明,未实现新核心。完整目标见 docs/02-architecture.md。 +实施时创建 domain、application、ports、infrastructure、presentation。 +禁止导入 nonebot、astrbot、zhenxun;内部模块采用相对导入。 +先实现注册、库存、资产和一个完整交易,不直接复制旧全局管理器。 diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..d1ee513 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,12 @@ +# 测试实施边界 + +当前没有新核心或业务自动化测试,不将空目录算作测试通过。 +迁移完整性可运行 python scripts/check_baseline.py。 + +后续按 docs/01-roadmap.md 和 docs/06-code-review.md 建立: +unit(纯规则与数值)、integration(SQLite 事务与并发)、 +contracts(框架输入输出)、migrations(迁移与恢复)、 +packaging(独立安装包及真实框架加载)。 + +首批必须覆盖旧缺陷 F01–F08/F11 和提交前取消、重复事件、跨日、 +同一玩家并发操作。测试使用脱敏构造数据,不提交真实玩家数据库。