LSP Animations Spec life 0.8

Users who are viewing this thread



[LSP]Spec life

This pack add animated spectators to arena in the form of agents.

Download: specLife v0.8
(installation inside)

Additional information:
  • Pack add 30 animations for stand troops, 21 for sit and one custom for tournament master.
  • The arena sounds turn on only if the spectators are spawned, if you dont have entries for spectators, they dont spawn
  • 60 - 79 entry = sit troop
  • 80 - 100 entry = stand troop
  • For tournament spawn noble troops, for common visits or melee fight spawn plebs
  • There are 4 arena sounds in mb resources, 3 of them are not used, you can experiment with them. I used default
  • You can customize the animation list leaving only those that fit. By default, everyone works
  • A scene with an example in the archive, also a collision for the used arena elements.
  • The arena sound on the video was superimposed separately, but in the game it's him

Changelog:
0.8

- Spawn animated spectators at entry points
- Nobles/Plebs at different missions
- Sounds play if spectators spawned
- Randomize animations & time
- 30 stand animations
- 21 sit animations
- 1 master animation




You can use it without asking for my permission. Just remember to:
- use it for non-commercial purposes
- give credit



Contributions:
.sco spectator prop replacer by Janycz said:
Well. I have made script for revitalization arenas. It replaces spr_arena_spectator_ with needed entry points.

C++ source:
Code:
#include <cstdio>
#include <cstring>
#include "ScoReader.h"
#include "ScoWriter.h"

bool starts_with(const char* string, const char* pattern)
{
    while(true)
    {
        if (*pattern == 0) break;
        if (*string == 0) return false;
        if (*string != *pattern) return false;
        string++;
        pattern++;
    }
    return true;
}

void mul_mat_3x3(float* result, const float* a, const float* b)
{
    for (int i = 0; i < 9; i++) result[i] = 0;

#define mat_at(m,r,c) ((m)[(3 * (r) + (c))])
    for(int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            for (int k = 0; k < 3; k++)
            {
                mat_at(result, i, j) += mat_at(a, i, k) * mat_at(b, k, j);
            }
        }
    }
#undef mat_at
}

int main(int argc, char **argv)
{
    char *input_file, *output_file;
    if (argc == 2)
    {
        input_file = output_file = argv[1];
    }
    else if(argc == 3)
    {
        input_file = argv[1];
        output_file = argv[2];
    }
    else
    {
        puts("Examples of using:");
        puts("arena_liver.exe <sco_input_file> <sco_output_file>");
        puts("arena_liver.exe <sco_file>");
        return 0;
    }

    int entryPointSitting = 60;
    int entryPointStanding = 80;

    const auto get_entry_for_standing = [&entryPointStanding]()
    {
        if (entryPointStanding >= 128)
            printf("WARNING: Not enought entries for standing. Entry #%d will be added.\n", entryPointStanding);

        return entryPointStanding++;
    };

    const auto get_entry_for_sitting = [&entryPointStanding, &entryPointSitting]()
    {
        if (entryPointSitting == 80)
        {
            printf("WARNING: Not enought entries for sitting. Entry #%d will be added.\n", entryPointStanding);
            return entryPointStanding++;
        }
        else
            return entryPointSitting++;
    };

    FILE *f;
    if (const int error = fopen_s(&f, input_file, "rb"))
    {
        printf("Cannot open '%s', fopen_s error code: %d\n", input_file, error);
        return 0;
    }

    sco_file_t scene;
    read_sco_file(f, &scene);

    float m[9], z_rot[9] = { -1, 0, 0, 0, -1, 0, 0, 0, 1 };

    for (int i = 0; i < scene.num_mission_objects; i++)
    {
        if (scene.mission_objects[i].meta_type == MT_SCENE_PROP && starts_with(scene.mission_objects[i].id, "spr_arena_spectator"))
        {
            scene.mission_objects[i].id[0] = 0;
            scene.mission_objects[i].meta_type = MT_ENTRY_POINT;
            scene.mission_objects[i].scale.x = scene.mission_objects[i].scale.y = scene.mission_objects[i].scale.z = 1;
            scene.mission_objects[i].sub_kind_no = 0;
            scene.mission_objects[i].variation_id = strstr(scene.mission_objects[i].id, "sitting") ? get_entry_for_sitting() : get_entry_for_standing();
            scene.mission_objects[i].variation_id_2 = 0;
            mul_mat_3x3(m, (float*)&scene.mission_objects[i].position, z_rot);
            memcpy(&scene.mission_objects[i].position, m, sizeof(float) * 9);
        }
    }

    if (const int error = fopen_s(&f, output_file, "wb"))
    {
        printf("Cannot open '%s', fopen_s error code: %d\n", output_file, error);
        return 0;
    }
    write_sco_file(f, &scene);

    return 0;
}
N. B. If you want it compile you must disable strict-aliasing in your compiler. (For g++ and clang -fno-strict-aliasing disables strict-aliasing, Visual Studio have got no strict-aliasing)

For compilation, it requires this: https://github.com/cuellius/ScoTools

Compiled binary program (requires C++ Redistributable 2017): https://mega.nz/#!BSZDhIiK!teAtLruiSnNMHhCsTAcDI1JZ2iFbh0rVWjKjsJSRUmk
 
Last edited:
Unfinished C++ script for replacing spr_arena_spectator_ to requested entries.
Code:
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <cctype>
#include <functional>
#include <algorithm>
#include <iterator>
#include "ScoReader.h"
#include "ScoWriter.h"

inline std::string trim(const std::string &s)
{
	const auto f = std::find_if_not(s.begin(), s.end(), [](int c) { return std::isspace(c); });
	return std::string(f, std::find_if_not(s.rbegin(), std::string::const_reverse_iterator(f), [](int c) { return std::isspace(c); }).base());
}

bool starts_with(const std::string& haystack, const std::string& needle) 
{
	return needle.length() <= haystack.length() && std::equal(needle.begin(), needle.end(), haystack.begin());
}

int main()
{
	sco_file_t scene;
	read_sco_file(fopen("E:\\Mount&Blade Warband\\Modules\\Rus 13th Century Way of the Warrior\\SceneObj\\scn_zendar_arena.sco", "rb"), &scene);

	int entryPoint = 80;
	for (int i = 0; i < scene.num_mission_objects; i++)
	{
		if (scene.mission_objects[i].meta_type == MT_SCENE_PROP && starts_with(scene.mission_objects[i].id, "spr_arena_spectator"))
		{
			scene.mission_objects[i].id[0] = 0;
			scene.mission_objects[i].meta_type = MT_ENTRY_POINT;
			scene.mission_objects[i].scale.x = scene.mission_objects[i].scale.y = scene.mission_objects[i].scale.z = 1;
			scene.mission_objects[i].sub_kind_no = 0;
			scene.mission_objects[i].variation_id = entryPoint++;
			scene.mission_objects[i].variation_id_2 = 0;
		}
	}

	write_sco_file(fopen("E:\\Mount&Blade Warband\\Modules\\Rus 13th Century Way of the Warrior\\SceneObj\\scn_zendar_arena.sco", "wb"), &scene);

	return 0;
}

As I said, it is unfinished.
And script has a serious issue: new created entries must be rotated on ? around z-axis.

P. S. It requires this: https://github.com/cuellius/ScoTools
 
Thanks for very useful apport.
You have a possibility to calculate look direction?

For Example:
Code:
           //Rotate angle Detection
            var finalRotationAngle = 0.0f;
            var targetPos = pathPos;
            var myPos = transform.position;
            var currentRot = transform.rotation;
            targetPos.y = myPos.y;
            var direction = (targetPos - myPos).normalized;
            
            var targetRot = Quaternion.LookRotation(direction);
            
            //target rotation + 180 & - 180
            var targetRotationAngle = targetRot.eulerAngles.y - currentRot.eulerAngles.y;
           
 
@Mark7, I can calculate it. I want to finish this script. Look direction of entry opposites to look direction of native spectators sceneprops (spr_arena_spectator_). In terms of mathematics, look direction of entry can be given in a result of rotation look direction of native spectators sceneprops on ? around z-axis.

In scene, game represents rotation using a matrix:
Code:
typedef struct vector
{
	float x;
	float y;
	float z;
} vector_t;

typedef struct matrix
{
	vector_t v0;
	vector_t v1;
	vector_t v2;
	vector_t o;
} matrix_t;
I do not fully understand it. But I think, that position calculated as: r* = U r + o, where U is matrix 3x3 (maybe uniform), which is assembled from rows v0, v1, v2, and o is a 3d-vector, which is represented as o is matrix_t structure. So, it is needed to multiple U matrix with rotation matrix on ? around z-axis.
 
Well. I have made script for revitalization arenas. It replaces spr_arena_spectator_ with needed entry points.

C++ source:
Code:
#include <cstdio>
#include <cstring>
#include "ScoReader.h"
#include "ScoWriter.h"

bool starts_with(const char* string, const char* pattern)
{
	while(true)
	{
		if (*pattern == 0) break;
		if (*string == 0) return false;
		if (*string != *pattern) return false;
		string++;
		pattern++;
	}
	return true;
}

void mul_mat_3x3(float* result, const float* a, const float* b)
{
	for (int i = 0; i < 9; i++) result[i] = 0;

#define mat_at(m,r,c) ((m)[(3 * (r) + (c))])
	for(int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				mat_at(result, i, j) += mat_at(a, i, k) * mat_at(b, k, j);
			}
		}
	}
#undef mat_at
}

int main(int argc, char **argv)
{
	char *input_file, *output_file;
	if (argc == 2)
	{
		input_file = output_file = argv[1];
	}
	else if(argc == 3)
	{
		input_file = argv[1];
		output_file = argv[2];
	}
	else 
	{
		puts("Examples of using:");
		puts("arena_liver.exe <sco_input_file> <sco_output_file>");
		puts("arena_liver.exe <sco_file>");
		return 0;
	}

	int entryPointSitting = 60;
	int entryPointStanding = 80;

	const auto get_entry_for_standing = [&entryPointStanding]()
	{
		if (entryPointStanding >= 128)
			printf("WARNING: Not enought entries for standing. Entry #%d will be added.\n", entryPointStanding);

		return entryPointStanding++;
	};

	const auto get_entry_for_sitting = [&entryPointStanding, &entryPointSitting]()
	{
		if (entryPointSitting == 80)
		{
			printf("WARNING: Not enought entries for sitting. Entry #%d will be added.\n", entryPointStanding);
			return entryPointStanding++;
		}
		else
			return entryPointSitting++;
	};

	FILE *f;
	if (const int error = fopen_s(&f, input_file, "rb"))
	{
		printf("Cannot open '%s', fopen_s error code: %d\n", input_file, error);
		return 0;
	}

	sco_file_t scene;
	read_sco_file(f, &scene);

	float m[9], z_rot[9] = { -1, 0, 0, 0, -1, 0, 0, 0, 1 };

	for (int i = 0; i < scene.num_mission_objects; i++)
	{
		if (scene.mission_objects[i].meta_type == MT_SCENE_PROP && starts_with(scene.mission_objects[i].id, "spr_arena_spectator"))
		{
			scene.mission_objects[i].id[0] = 0;
			scene.mission_objects[i].meta_type = MT_ENTRY_POINT;
			scene.mission_objects[i].scale.x = scene.mission_objects[i].scale.y = scene.mission_objects[i].scale.z = 1;
			scene.mission_objects[i].sub_kind_no = 0;
			scene.mission_objects[i].variation_id = strstr(scene.mission_objects[i].id, "sitting") ? get_entry_for_sitting() : get_entry_for_standing();
			scene.mission_objects[i].variation_id_2 = 0;
			mul_mat_3x3(m, (float*)&scene.mission_objects[i].position, z_rot);
			memcpy(&scene.mission_objects[i].position, m, sizeof(float) * 9);
		}
	}

	if (const int error = fopen_s(&f, output_file, "wb"))
	{
		printf("Cannot open '%s', fopen_s error code: %d\n", output_file, error);
		return 0;
	}
	write_sco_file(f, &scene);

	return 0;
}
N. B. If you want it compile you must disable strict-aliasing in your compiler. (For g++ and clang -fno-strict-aliasing disables strict-aliasing, Visual Studio have got no strict-aliasing)

For compilation, it requires this: https://github.com/cuellius/ScoTools

Compiled binary program (requires C++ Redistributable 2017): https://mega.nz/#!BSZDhIiK!teAtLruiSnNMHhCsTAcDI1JZ2iFbh0rVWjKjsJSRUmk
 
Compiling Floris Gameplay Mod Pack to a custom directory
Start Processing...
______________________________

Traceback (most recent call last):
  File "process_init.py", line 2, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_global_variables.py", line 12, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting strings...
Exporting skills...
Exporting tracks...
Exporting animations...
Exporting meshes...
Exporting sounds...
Exporting skins...
Traceback (most recent call last):
  File "process_map_icons.py", line 6, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting faction data...
Exporting item data...
Traceback (most recent call last):
  File "process_items.py", line 66, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting scene data...
Traceback (most recent call last):
  File "process_scenes.py", line 15, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting troops data
Exporting particle data...
Traceback (most recent call last):
  File "process_scene_props.py", line 7, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_tableau_materials.py", line 8, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_presentations.py", line 8, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting party_template data...
Traceback (most recent call last):
  File "process_parties.py", line 6, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting quest data...
Exporting info_page data...
Traceback (most recent call last):
  File "process_scripts.py", line 7, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_mission_tmps.py", line 5, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_game_menus.py", line 8, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_simple_triggers.py", line 5, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_dialogs.py", line 9, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Traceback (most recent call last):
  File "process_global_variables_unused.py", line 3, in <module>
    from process_operations import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\process_operations.py", line 21, in <module>
    from module_mission_templates import *
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\module_mission_templates.py", line 41332, in <module>
    modmerge(var_set, component_name)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 297, in modmerge
    modmerge__(modcomp_name,var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\modmerger.py", line 239, in modmerge__
    _temp.__dict__[mergefn_name](var_dict)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1965, in modmerge
    modmerge_mission_templates(orig_mission_templates)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\pbod_mission_templates.py", line 1991, in modmerge_mission_templates
    trigger_i = MissionTemplateWrapper(orig_mission_templates).FindTrigger_i(1,4,ti_once,[(main_hero_fallen)])
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 547, in FindTrigger_i
    trigger = self.GetTrigger(i_search)
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 521, in GetTrigger
    return TriggerWrapper(self.GetTriggers()) # no range check
  File "C:\Users\Mikkel\Desktop\Ny PC\Floris Dev Suite 2.5\util_wrappers.py", line 331, in __init__
    raise ValueError("TriggerWrapper: Wrapped must be a trigger record.")
ValueError: TriggerWrapper: Wrapped must be a trigger record.
Exporting postfx_params...
Exporting flora data...
Exporting ground_spec data...
Exporting skyboxes...
Finished.

______________________________

Copying source files to internal directory...
Moving source files to custom mod directory...
Traceback (most recent call last):
  File "other_files_custom.py", line 56, in <module>
    shutil.move("./actions.txt",export_dir_main + "./Modules/" + export_dir_custom + "./actions.txt")
  File "C:\Python27\lib\shutil.py", line 301, in move
    copy2(src, real_dst)
  File "C:\Python27\lib\shutil.py", line 130, in copy2
    copyfile(src, dst)
  File "C:\Python27\lib\shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 2] No such file or directory: 'C:/Program Files (x86)/Steam/steamapps/common/mountblade warband/./Modules/./Floris Mod Pack 2.5/./actions.txt'
        1 file(s) moved.

______________________________

All Finished ...
Cleaning up...
______________________________

Script processing has ended.
Press any key to exit. . .


I'm getting this error when trying to compile - double checked twice to see if all the source codes had been done properly, so think it has something to do with mod merger interfering.
 
Hello, Mark7,

Very very good work. It's awesome.

Could you make other cool animations. ex : blacksmith, wood cutter, etc...

Again, thanks a lot.
 
Until the release of bannerlord tools, I’m unlikely to be modding a M&B. Because of the obsolescence of the warband engine and the complexity of working with it. You can try to do the above animations yourself (because of not much complexity). Here is a tool for convenient work with animation for WB.
 
Back
Top Bottom